C# 正则表达式组问题
C# regex groups trouble
很抱歉,这可能是个愚蠢的问题,但我无法解决小问题,也无法在 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 ([A-Za-z0-9]+) = {(([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+)}
您应该获取第 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}");
}
输出:
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
很抱歉,这可能是个愚蠢的问题,但我无法解决小问题,也无法在 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 ([A-Za-z0-9]+) = {(([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+)}
您应该获取第 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}");
}
输出:
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