2

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

#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());
}

PS 调试代码。

我使用这个在线工具http://regexhero.net/tester/来测试正则表达式,但同样的结果发生在 MessageBox

4

1 回答 1

7

当你在做

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

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

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

不要忘记对value;做同样的事情 另外,+意思是“一个或多个”,所以用那个代替{1,}.

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

最后,我认为使用它match.Groups[n].Value而不是match.Groups[n].ToString().

于 2013-07-04T13:06:44.373 回答