.NET Regex:获取所有匹配的组

时间:2011-06-01 19:48:17

标签: c# .net regex

我坚持使用.NET的正则表达式问题。例如,我有下一个正则表达式模式:(?'group1'A | C)|(?'group2'B | C)|(?'group3'A | B | C)

当我匹配“ AXYZ ”时,我收到包含值和组的匹配对象;如果我去群组,我会看到只有一个群体成功 - group1 (群组3为假)。如果我匹配“ BXYZ ”,我只会收到 group2 ,并且成功为true(group3为false)。

我怎样才能在比赛中获得满足比赛的所有组?

例如,上面应该是:group1& “ AXYZ ”中的group3和group2& “ BXYZ ”中的group3。

以上所有内容仅为实际系统中的示例,有不同的模式(每个3个以上的字母)和更复杂的输入文本(1000+个单词)。

4 个答案:

答案 0 :(得分:2)

这个问题似乎有点抽象,但如果你坚持使用单一的正则表达式,你可以使用可选的lookaheads来做这样的事情:

(?=(?'group1'A|C)?)(?=(?'group2'B|C)?)(?=(?'group3'A|B|C)?)

Lookaheads匹配但不捕获,因此在这种情况下您的匹配将为空,但组将按预期进行,并且可能会重叠。

工作示例: http://ideone.com/PTtQu

答案 1 :(得分:1)

你在那里的正则表达式只匹配单个字符;一旦在角色上找到匹配,正则表达式就会移动到输入字符串中的下一个字符。在您的示例中,'B'永远不会与'group2'或'group3'匹配,因为它将始终与'group1'匹配。同样,出于同样的原因,'A'永远不会被'group3'匹配。

使用正则表达式获得所需结果的一种方法是将每个组视为单独的正则表达式,并在每个组上使用Regex.IsMatch()。对于计数,以下C#执行我认为您要求的内容:

string input = "AXYZ";
int count = 0;

count += Regex.IsMatch(input, "A|B") ? 1 : 0;
count += Regex.IsMatch(input, "B|C") ? 1 : 0;
count += Regex.IsMatch(input, "A|B|D") ? 1 : 0;

Console.WriteLine(count); // returns 2

答案 2 :(得分:0)

我相信你必须让正则表达式“贪婪”。以下是一些信息:

http://blogs.msdn.com/b/ericgu/archive/2005/08/19/453869.aspx

答案 3 :(得分:0)

正则表达式引擎非常渴望,这意味着它将始终返回最左侧的匹配并在找到匹配后停止匹配。为了演示,请考虑以下示例:

string input = "Hello World";
string pattern = "Hello|Hello World";
Console.WriteLine(Regex.Match(input, pattern).Value);
pattern = "Hello World|Hello";
Console.WriteLine(Regex.Match(input, pattern).Value);

在您的情况下,group1首先匹配,因此所有其他组都不匹配并返回false。此外,您声称“BXYZ”返回group2,但这不是正确的。 “AXYZ”和“BXYZ”都匹配group1:(?'group1'A|B)。如果您需要测试每个组,则需要使用单独的正则表达式进行测试。