C#regrex重复多次的字符串

时间:2019-06-10 22:39:17

标签: c# regex regex-negation regex-group regex-greedy

我想为该字符串提供一个正则表达式,其中输出将像这样:

CP_RENOUNCEABLE
CP_RIGHTS_OFFER_TYP
CP_SELLER_FEED_SOURCE
CP_SELLER_ID_BB_GLOBAL
CP_PX
CP_RATIO
CP_RECLASS_TYP

我尝试将regex与 字符串模式= @“ 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;

                }
            }

1 个答案:

答案 0 :(得分:1)

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

(CP_[A-Z_]+),

Demo 1

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

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

,我们会在[,\s]中添加所需字符串之后可能出现的所有字符。

Demo 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\((.+?),

Demo 3