正则表达式中的误解群体,这可能吗?

时间:2015-02-16 08:31:05

标签: c# regex

我认为我误解了小组如何在正则表达式和C#中工作。但是,我仍然想知道我想要的是否可能。

我们采取以下字符串

:::name(uploadFileName)

与表达式

匹配
\A:::[a-zA-Z0-9_-]+\([a-zA-Z0-9_-]+\)

我希望能够轻松提取property = name然后value = uploadFileName之类的内容。

我认为这会发生在群组中,其中match.Groups[0].Valuenamematch.Groups[1].ValueuploadFileName。根据群体的定义,我认为这是真的:

  

分组构造描述正则表达式的子表达式并捕获输入字符串的子字符串。

但是,match.Groups[0].Value只是整个字符串:::name(uploadFileName)

2 个答案:

答案 0 :(得分:5)

第0组是整场比赛。其他匹配从1开始。然而,你的正则表达式没有捕获任何东西,因为没有未转义的括号。如果您没有附带的括号组,可以使用以下内容。为简单起见,我建议在这里使用命名捕获:

\A:::(?<name>[a-zA-Z0-9_-]+)\((?<property>[a-zA-Z0-9_-]+)\)

然后,您的结果将在match.Groups["name"].Value(=姓名)和match.Groups["property"].Value(= uploadFileName)。

答案 1 :(得分:4)

第0个项是正则表达式匹配的整个字符串。之后的索引是每个捕获组的内容。因此,您需要两个捕获组:

\A:::([a-zA-Z0-9_-]+)\(([a-zA-Z0-9_-]+)\)

然后match.Groups[1].Value将是namematch.Groups[2].Value将是uploadFileName。请注意第二部分的双括号 - \(\)匹配字面括号字符,而非转义符号则描述正则表达式的实际捕获组。