C# 正则表达式组麻烦

Posted

技术标签:

【中文标题】C# 正则表达式组麻烦【英文标题】:C# regex groups trouble 【发布时间】:2018-05-25 04:47:29 【问题描述】:

很抱歉,这可能是个愚蠢的问题,但我无法解决小问题,也无法在 google 中找到相同的问题。所以,我想写在这里。我需要解析相同的字符串:

string line = "HELLO MYNAME IS1 = P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55";

我的代码是:

string line = "HELLO MYNAME IS1 = P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55";
Regex re = new Regex(@"^HELLO MYNAME ([A-Za-z0-9]+) = ([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+");
MatchCollection matchCollection = re.Matches(line);
foreach(Match m in matchCollection)

    Console.WriteLine("Match: ");
    foreach(Group gr in m.Groups)
    
        Console.WriteLine($"No gr.Index Value: gr.Value");
    
 

但我不明白为什么输出看起来像这样:

匹配:

没有 0 值:你好,我的名字 IS1 = P 111.11,O -222.22,L 333.33,L -444.44,Y 555.55 13 号值:IS1 无 62 值:Y 555.55

再次抱歉,你能解释一下为什么只有最后一组有结果吗?

【问题讨论】:

你可以使用(?:^HELLO MYNAME (\w+) = |\G(?!\A)\s*,\s*)([A-Z]\s[+-]?\d+\.\d+) 【参考方案1】:

您应该获取 Group 1 的值以获取第一个捕获组捕获的值,并获取第二个捕获组捕获的所有 捕获

string line = "HELLO MYNAME IS1 = P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55";
Regex re = new Regex(@"^HELLO MYNAME ([A-Za-z0-9]+) = ([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+");
MatchCollection matchCollection = re.Matches(line);
foreach(Match m in matchCollection)

    Console.WriteLine("Match: ");
    Console.WriteLine(m.Groups[1].Value);
    foreach (Capture cap in m.Groups[2].Captures)
        Console.WriteLine($"No cap.Index Value: cap.Value");

见C# demo

输出:

Match: 
IS1
No 20 Value: P 111.11, 
No 30 Value: O -222.22, 
No 41 Value: L 333.33, 
No 51 Value: L -444.44, 
No 62 Value: Y 555.55

【讨论】:

谢谢,我不知道【参考方案2】:

根据定义,重复捕获组将仅捕获最后一次迭代。 在重复组周围放置一个捕获组以捕获所有迭代:

^HELLO MYNAME ([A-Za-z0-9]+) = (([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+)

【讨论】:

C# 不只是捕获最终匹配。 C# 实际上保留了所有捕获。 @ctwheels,是的,你说得对,C# 没有。我知道。我正在处理一般的 EMCA 组捕获实施。

以上是关于C# 正则表达式组麻烦的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的正则表达式组

正则表达式在 C# 中按组替换

C# 中的正则表达式组

正则表达式 c# 获取捕获组的子组

C# 正则表达式捕获组不起作用

c# 正则表达式捕获