【问题标题】:Misunderstanding groups in regex, is this possible?正则表达式中的误解组,这可能吗?
【发布时间】:2015-02-16 08:31:05
【问题描述】:

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

让我们来看看下面的字符串

:::name(uploadFileName)

与表达式匹配的

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

我想要做的是轻松提取出property = namevalue = uploadFileName 之类的内容。

我认为这会发生在群组中,其中match.Groups[0].Value 将是namematch.Groups[1].Value 将是uploadFileName。根据组的定义,我认为这是正确的:

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

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

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    第0组是整场比赛。其他匹配以 1 开头。但是,您的正则表达式不会捕获任何内容,因为没有未转义的括号。如果您没有括起来的括号组,则可以使用以下内容。为简单起见,我建议在此处使用命名捕获:

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

    然后,您将在 match.Groups["name"].Value (=name) 和 match.Groups["property"].Value (= uploadFileName) 中获得结果。

    【讨论】:

    • 我更喜欢你的解决方案,因为捕获组的明确名称......不太容易出错,并且更具可读性(利用结果时)
    【解决方案2】:

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

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

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

    【讨论】:

    • 哦,所以括号描述了捕获组??这是我理解中缺少的关键。
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2021-08-11
    • 2017-05-14
    相关资源
    最近更新 更多