首页 > 解决方案 > c# regex 用于重复多次的字符串

问题描述

我想对输出如下的字符串有一个正则表达式:

CP_RENOUNCEABLE
CP_RIGHTS_OFFER_TYP
CP_SELLER_FEED_SOURCE
CP_SELLER_ID_BB_GLOBAL
CP_PX
CP_RATIO
CP_RECLASS_TYP

我尝试将正则表达式与字符串模式 = @"ISNULL(*)";

string strSearch = @" 
                LTRIM(RTRIM(ISNULL(CP_RENOUNCEABLE,'x2x'))), ISNULL(CP_RIGHTS_OFFER_TYP,-1), LTRIM(RTRIM(ISNULL(CP_SELLER_FEED_SOURCE,'x2x'))),
                 LTRIM(RTRIM(ISNULL(CP_SELLER_ID_BB_GLOBAL,'x2x'))),ISNULL(CP_PX,-1), ISNULL(CP_RATIO,-1), ISNULL(CP_RECLASS_TYP,-1);

  string pattern = @"ISNULL(*\)";            

 foreach (Match match in Regex.Matches(strSearch, pattern))
            {
                if (match.Success && match.Groups.Count > 0)
                {
                    var text = match.Groups[1].Value;

                }
            }

标签: c#regexregex-negationregex-groupregex-greedy

解决方案


我的猜测是,我们在问题中列出的所需输出之后会有一个逗号,那么这个简单的表达式可能就足够了,

(CP_[A-Z_]+),

演示 1

如果我的猜测不正确,并且之后会有其他字符(例如空格),我们可以在捕获组的右侧添加一个 char 类,例如:

(CP_[A-Z_]+)[,\s]

我们将添加任何可能出现在我们想要的字符串之后的字符[,\s]

演示 2

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(CP_[A-Z_]+),";
        string input = @"LTRIM(RTRIM(ISNULL(CP_RENOUNCEABLE,'x2x'))), ISNULL(CP_RIGHTS_OFFER_TYP,-1), LTRIM(RTRIM(ISNULL(CP_SELLER_FEED_SOURCE,'x2x'))),
                 LTRIM(RTRIM(ISNULL(CP_SELLER_ID_BB_GLOBAL,'x2x'))),ISNULL(CP_PX,-1), ISNULL(CP_RATIO,-1), ISNULL(CP_RECLASS_TYP,-1);";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

编辑:

为了捕获介于ISNULL和第一个逗号之间的内容,这可能有效:

ISNULL\((.+?),

演示 3


推荐阅读