【发布时间】:2014-03-03 19:10:33
【问题描述】:
我在 C# 中有一个像这样的非常简单的正则表达式:
(var \= 0\;)
但是当我尝试将其与仅出现一次模式的字符串进行匹配时,我会返回多个组。输入字符串为:
foo bar
var = 0;
foo
我得到 Regex 对象返回的 1 个匹配项,但在里面我看到两个组,每个组都有 1 个捕获,这是我想要的字符串。 我需要正则表达式中的分组括号,因为这是更大的正则表达式的一部分,我需要将其作为一个组捕获。 我做错了什么?
编辑
这是我正在使用的 C# 代码:
private const string REGEX = "(var \\= [0]\\;)";
MatchCollection matches = REGEX.Matches(inputStr);
foreach (Match m in matches)
{
foreach (Group g in m.Groups)
{
Console.WriteLine("group[" + g.Captures.Count + "]: '" + g.ToString() + "'");
}
}
这是我得到的:
group[1]: 'var = 0;'
group[1]: 'var = 0;'
我的问题是,为什么我得到两组而不是一组?
编辑#2:
更复杂的模式显示了问题。模式:
# preceding comment
class
{
(param1 = "val1", param2 = "val2", param3 = val3)
}
[
# inside comment
setting1 = 0;
setting2 = 0;
]
我正在使用的正则表达式:(它可能不是最明显的,但如果您想查看,可以将其粘贴到正则表达式查看器中)
(\#[^\n]*)?(?:[\s\r\n]*)domain(?:[\s\r\n]*)\{(?:[\s\r\n]*)\((?:[\s\r\n]*)(((?:[\s\r\n]*)(accountName(?:[\s\r\n]*)\=(?:[\s\r\n]*)\"[^"]+\"[,]?)(?:[\s\r\n]*))|((?:[\s\r\n]*)(tableName(?:[\s\r\n]*)\=(?:[\s\r\n]*)\"[^"]+\"[,]?)(?:[\s\r\n]*))|((?:[\s\r\n]*)(cap(?:[\s\r\n]*)\=(?:[\s\r\n]*)[\d]+[,]?)(?:[\s\r\n]*))|((?:[\s\r\n]*)(MinPartitionCount(?:[\s\r\n]*)\=(?:[\s\r\n]*)[\d]+[,]?)(?:[\s\r\n]*)))+\)(?:[\s\r\n]*)\}(?:[\s\r\n]*)\[(?:[\s\r\n]*)(\#[^\n]*)?(?:[\s\r\n]*)((?:[\s\r\n]*)(IsSplitEnabled(?:[\s\r\n]*)\=(?:[\s\r\n]*)[0|1](?:[\s\r\n]*)\;)(?:[\s\r\n]*)|(?:[\s\r\n]*)(IsMergeEnabled(?:[\s\r\n]*)\=(?:[\s\r\n]*)[0|1](?:[\s\r\n]*)\;)(?:[\s\r\n]*))*(?:[\s\r\n]*)\]
我得到:
group:1: '# preceding comment
domain
{
(param1 = "val1", param2 = "val2", param3 = val3)
}
[
# inside comment
setting1 = 0;
setting2 = 0;
]'
'roup:1: '# preceding comment
group:3: 'cap = 1200'
group:1: 'param1 = "val1", '
group:1: 'param1 = "val1",'
group:1: 'param2 = "val2", '
group:1: 'param2 = "val2",'
group:1: 'param3 = val3'
group:1: 'param3 = val3'
'roup:1: '# inside comment
group:2: 'setting1 = 0;
'
group:1: 'setting1 = 0;'
group:1: 'setting2 = 0;'
【问题讨论】:
-
你能展示一个演示问题的最小 C# 示例吗?
-
可能您的第一组用于整个表达式,而第二组用于您的正则表达式中明确的组?如果您命名您的捕获组会发生什么 - 两个组会显示相同的名称吗?例如
(?<mygroup>var \= 0\;) -
@LB2 如何在 C# 中打印组名?
-
@Yasser 我以为它有一个属性,但你是对的,没有一个(奇怪)。但 davisoa 的回答与我之前的评论基本相同——第一组是整个表达式,然后是子组。
-
我是凭记忆写的,但是有一种方法可以检索组名列表。只需在 LINQPad 上测试您的代码并转储结果,以便您可以查看所有属性。