c # regrex для строки, повторенной несколько раз - PullRequest
0 голосов
/ 11 июня 2019

Я хотел бы иметь регулярное выражение для строки, в которой будет вывод:

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;

                }
            }

1 Ответ

1 голос
/ 11 июня 2019

Я предполагаю, что у нас будет запятая после наших желаемых результатов, перечисленных в вопросе, которых тогда может хватить этого простого выражения,

(CP_[A-Z_]+),

Демо 1

Если бы мое предположение было неверным, и после этого у нас были бы другие символы, такие как пробел, мы могли бы добавить класс char в правой части нашей группы захвата, такой как:

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

и мы добавим любой символ, который может появиться после желаемых строк в [,\s].

Демонстрация 2

Test

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);
        }
    }
}

Edit:

Для захвата того, что находится между ISNULL и первой запятой, это может работать:

ISNULL\((.+?),

Demo 3

...