我创建了这个正则表达式:
#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中也会出现相同的结果
答案 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()
会更直接。