正则表达集团没有获得所有字符串

时间:2013-07-04 13:02:38

标签: c# regex

我创建了这个正则表达式:

#define[\s]{1,}(?<name>[a-zA-Z0-9_$]){1,}[\s]{1,}(?<value>[a-zA-Z0-9_$\s()={},;.?:]){1,}

但是当我测试它时,给我这个结果:

name: E
value: 6

字符串:

#define MAX_ARENE               10123456

如何获取组中的所有字符串而不仅仅是最后一个字符?

无论如何,如果你需要这是我的C#代码:

Match match = Regex.Match(line, @"#define[\s]{1,}([a-zA-Z0-9_$]){1,}[\s]{1,}([a-zA-Z0-9_$\s()={},;.]){1,}", RegexOptions.Singleline);

if (match.Success)
{
    MessageBox.Show(match.Groups[1].ToString() + match.Groups[2].ToString());
    defines.Add(match.Groups[1].ToString(), match.Groups[2].ToString());
    node.Nodes.Add(match.Groups[1].ToString());
}

P.S调试代码。

我使用这个在线工具http://regexhero.net/tester/来测试正则表达式,但在MessageBox中也会出现相同的结果

1 个答案:

答案 0 :(得分:7)

当你做

(?<name>[a-zA-Z0-9_$]){1,}

您重复捕获组本身(与单个字符匹配),从而在下一次重复时覆盖每个单字符匹配结果。你想用

(?<name>[a-zA-Z0-9_$]+)

不要忘了对value做同样的事情;此外,+表示&#34;一个或多个&#34;,因此请使用该代替{1,}

[\s]也是多余的 - \s就足够了。

最后,我认为使用match.Groups[n].Value代替match.Groups[n].ToString()会更直接。