无法识别的分组构造

Posted

技术标签:

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

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

我的代码:

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

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

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

【问题讨论】:

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

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

【讨论】:

以上是关于无法识别的分组构造的主要内容,如果未能解决你的问题,请参考以下文章

“ValueError:无法识别的标记样式'hline'”。 Matplotlib plot() 和 scatter() 函数无法识别一堆标记

如何修复:“无法识别的令牌'无法识别':期待('true','false'或'null')”使用Horton schema-registry

Swift 3:将无法识别的选择器发送到手势识别器实例

二维码无法识别的原因

二维码无法识别的原因

js无法识别的字符都有哪些