正则表达式捕获组

时间:2019-01-07 14:56:49

标签: c# regex expression capturing-group

具有以下正则表达式:

InitValue\((\w*)\)

和测试字符串:

InitValue(Input1)

我得到以下结果:

Full match: InitValue(Input1)
Group1: Input1

具有以下正则表达式:

InitValue\((\w*)\s*,\s*(\w*)\)

和测试字符串:

InitValue(Input1, Input2)

我得到:

Full match: InitValue(Input1, Input2)
Group1: Input1
Group2: Input2

现在,我想捕获InitValue方法的任意数量的参数。 InitValue的参数数量未知。

Full match: InitValue(Input1, Input2, ..., Inputn)
Group1: Input1
Group2: Input2
....
Groupn: Inputn

由于我事先不知道参数的数量,所以我不能在正则表达式中重复以下模式:

\s*,\s*(\w*)

如何编写输出n个捕获组的正则表达式?

我在C#代码中使用正则表达式(正则表达式,匹配项)...

4 个答案:

答案 0 :(得分:1)

可以在.NET中执行此操作-您使用单个捕获Group,然后访问组的Captures集合以查看其捕获的所有项目,而不仅仅是最终的{{ 1}}。

您必须编写一个可以重复参数匹配组的正则表达式,例如

Value

Debuggex Demo玩耍,使其与您想要的内容匹配。

答案 1 :(得分:1)

static void GetParams()
{
    int x = 0;
    var strings = new[]
    {
        "InitValue()",
        "InitValue(Input1)",
        "InitValue(Input1, Input2, Input3, Input4)"
    };

    var pattern = @"(\w+)\((?:(\w+)(?:,?\s*))*\)";

    foreach (var s in strings)
    {
        WriteLine($"String: '{s}'");
        var match = Regex.Match(s, pattern);
        if (match.Success)
        {
            WriteLine($"\tMethod: '{match.Groups[1].Value}'");
            WriteLine("\tParameters:");
            var captures = match.Groups[2].Captures;
            if (captures.Count > 0)
            {
                x = 0;
                foreach (Capture capture in captures)
                {
                    WriteLine($"\t\tParam {++x}: '{capture.Value}'");
                }
            }
            else
            {
                WriteLine("\t\tNo params found.");
            }

            WriteLine();
        }

        else
            WriteLine("No matches found.");
    }
}

/*
Output:

String: 'InitValue()'
        Method: 'InitValue'
        Parameters:
                No params found.

String: 'InitValue(Input1)'
        Method: 'InitValue'
        Parameters:
                Param 1: 'Input1'

String: 'InitValue(Input1, Input2, Input3, Input4)'
        Method: 'InitValue'
        Parameters:
                Param 1: 'Input1'
                Param 2: 'Input2'
                Param 3: 'Input3'
                Param 4: 'Input4'
*/

答案 2 :(得分:1)

.NET支持(?<=之后的无限回溯。除了获取捕获组以外,另一种选择可能是获取匹配项:

(?<=\bInitValue\([^()]*)[^, ]+(?=[^()]*\))

说明

  • (?<=后向正面,请检查左侧匹配项:
    • \bInitValue\([^()]*匹配单词边界,InitValue(,然后匹配0+次()中的任何一个
  • )往后看积极
  • [^, \t]+否定字符类,匹配1次以上而不是空格或逗号
  • (?=前瞻,以检查右边的匹配项:
    • [^()]*\)匹配0+次()中的任何一个都不匹配,然后匹配)
  • )积极回望

例如:

string pattern = @"(?<=\bInitValue\([^()]*)[^, ]+(?=[^()]*\))";
string str = "InitValue(Input1, Input2, Input3)";            
foreach (Match m in Regex.Matches(str, pattern))
{
    Console.WriteLine(m.Value);
}

结果

Input1
Input2
Input3

请参见Regex demo | C# demo

答案 3 :(得分:0)

别让任何人告诉你什么是不可能的,什么不是不可能的

enter image description here

您必须稍微触摸一下,但我认为它可以指导您= D。

编辑,回答您的问题。 b.Count将为您提供匹配项的数量。
编辑2,我发布图片以显示调试信息。但是这里是sibarist的代码。

string bar = "test, othertest";
Regex reg = new Regex(@"[\w]+");

MatchCollection b = reg.Matches(bar);

string b1 = b[0].Value;
string b2 = b[1].Value;

int numberGroups = b.Count;

编辑3,如注释中所述,这是完整的解决方案,您需要使用另一个RegexSubstring清除 InitValue(*)部分。

string input = "InitValue(test, othertest, bleh, blehTest, foo)";

Regex regArgs = new Regex(@"(?:InitValue\()(.*)(?:\))");
Match matchArgs = regArgs.Match(input);

string valueArgs = matchArgs.Groups[1].Value;

Regex reg = new Regex(@"[\w]+");

MatchCollection b = reg.Matches(valueArgs);

string b1 = b[0].Value;
string b2 = b[1].Value;

int numberGroups = b.Count;