【问题标题】:Unrecognized grouping construct无法识别的分组构造
【发布时间】:2018-06-16 02:47:49
【问题描述】:

我有一个正则表达式,它应该获取已知字符串之间的字符串,但它不断抛出异常:

无法识别的分组构造

我的代码:

Match matchKey = Regex.Match(m.Value, @"(?s*)key(.*?)</dt>");

Key 是第一个已知字符串,&lt;/dt&gt; 是第二个。

我不明白这里有什么问题?

【问题讨论】:

  • 我可以提供一个字符串示例来说明您要匹配的内容吗?
  • (?s*) 应该匹配什么?
  • 如果要匹配括号,则需要将( 转义为\(。否则 ? 没有意义 - 它是一个特殊符号,用于匹配“之前”事物的 01 倍 - 而且它之前没有任何东西......如果你想匹配? - 逃避也是如此

标签: c# .net regex match


【解决方案1】:

此模式无法编译。您需要使用\ 转义/。 其次,添加,需要给组添加一个名字:

(?<first>s*)key(.*?)<\/dt>

如果你想按字面匹配,你还需要转义&lt;,/,&gt;

Regex101 是一个尝试正则表达式的好网站。它将非常详细地描述您的模式并指出任何错误。

【讨论】:

    【解决方案2】:

    我测试了您的正则表达式,它确实不起作用。备注:

    • (?s*):如果你想占领这个群体,你要么必须放弃 ? 或添加组名,如(?&lt;g1&gt;s*)
    • (?&lt;g1&gt;s*):这匹配 0 到 N 倍 char s 的字符串,这是你真正想要的吗?
    • &lt;/dt&gt;: / 应该像这样转义&lt;\/dt&gt;

    这是我在字符串 ssssskeySomething&lt;/dt&gt; 上尝试的正则表达式:

    (s*)key(.*?)&lt;\/dt&gt;

    如果您想在key&lt;/td&gt; 之前捕获未知字符串,那么它应该是这样的(在SomethingkeySomething&lt;/dt&gt; 上测试):

    (.*)key(.*?)<\/dt>
    

    【讨论】:

      【解决方案3】:

      您的直接问题的答案是(? 不是有效的分组结构。对于有效组构造的列表,我建议您转到regex101.com,然后在“快速参考”的右下角选择“组构造”。这也是一个非常好的构建和测试搜索的网站。

      修复此组结构后,尽管仍然存在您没有转义 / 字符的问题,因此这也会返回错误。

      让我们一步一步分解发生了什么:

      (?s*)key(.*?)&lt;/dt&gt; 是您要搜索的内容。

      (? 不是有效的分组结构,是您收到错误的原因。根据您要执行的操作,您可以通过删除? 将其更改为捕获组,或者通过将其更改为(?: 将其更改为非捕获组,或者如果您尝试做一些不同的事情,它可能需要一个完全不同的变化。如果不知道你到底想要什么,我真的不能说更多。

      s* 匹配 0 个或多个 s 字符

      ) 关闭分组构造

      key 按字面意思匹配键

      (.*?) 匹配 0 个或多个任意字符。这是在捕获组内。 ? 使量词变得惰性,因此它会尽可能少地匹配。

      &lt;/dt&gt; 将给出错误,因为在正则表达式中对/ 的任何使用都必须转义(\/)。将其更改为 &lt;\/dt&gt; 将匹配 &lt;/dt&gt; 字面意思。

      所以在更改这两个错误后,我们会得到类似:(?:s*)key(.*?)&lt;/dt&gt;

      现在可以了。但是,我不知道它是否会按照您的意愿去做,因为我几乎没有迹象表明您真正想要做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多