具有以下正则表达式:
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#代码中使用正则表达式(正则表达式,匹配项)...
答案 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)
别让任何人告诉你什么是不可能的,什么不是不可能的
您必须稍微触摸一下,但我认为它可以指导您= 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,如注释中所述,这是完整的解决方案,您需要使用另一个Regex
或Substring
清除 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;