无法识别的分组构造
Posted
技术标签:
【中文标题】无法识别的分组构造【英文标题】:Unrecognized grouping construct 【发布时间】:2018-06-16 02:47:49 【问题描述】:我有一个正则表达式,它应该获取已知字符串之间的字符串,但它不断抛出异常:
我的代码:
Match matchKey = Regex.Match(m.Value, @"(?s*)key(.*?)</dt>");
Key 是第一个已知字符串,</dt>
是第二个。
我不明白这里有什么问题?
【问题讨论】:
我可以提供一个字符串示例来说明您要匹配的内容吗?(?s*)
应该匹配什么?
如果要匹配括号,则需要将(
转义为\(
。否则 ?
没有意义 - 它是一个特殊符号,用于匹配“之前”事物的 0
或 1
倍 - 而且它之前没有任何东西......如果你想匹配? - 逃避也是如此
【参考方案1】:
此模式无法编译。您需要使用\
转义/
。
其次,添加,需要给组添加一个名字:
(?<first>s*)key(.*?)<\/dt>
如果你想按字面匹配,你还需要转义<
,/
,>
。
Regex101 是一个尝试正则表达式的好网站。它将非常详细地描述您的模式并指出任何错误。
【讨论】:
【参考方案2】:我测试了您的正则表达式,它确实不起作用。备注:
(?s*)
:如果你想占领这个群体,你要么必须放弃
?
或添加组名,如(?<g1>s*)
(?<g1>s*)
:这匹配 0 到 N 倍 char s
的字符串,这是你真正想要的吗?
</dt>
: / 应该像这样转义<\/dt>
这是我在字符串 ssssskeySomething</dt>
上尝试的正则表达式:
(s*)key(.*?)<\/dt>
如果您想在key
和</td>
之前捕获未知字符串,那么它应该是这样的(在SomethingkeySomething</dt>
上测试):
(.*)key(.*?)<\/dt>
【讨论】:
【参考方案3】:您的直接问题的答案是(?
不是有效的分组结构。对于有效组构造的列表,我建议您转到regex101.com,然后在“快速参考”的右下角选择“组构造”。这也是一个非常好的构建和测试搜索的网站。
修复此组结构后,尽管仍然存在您没有转义 /
字符的问题,因此这也会返回错误。
让我们一步一步分解发生了什么:
(?s*)key(.*?)</dt>
是您要搜索的内容。
(?
不是有效的分组结构,是您收到错误的原因。根据您要执行的操作,您可以通过删除?
将其更改为捕获组,或者通过将其更改为(?:
将其更改为非捕获组,或者如果您尝试做一些不同的事情,它可能需要一个完全不同的变化。如果不知道你到底想要什么,我真的不能说更多。
s*
匹配 0 个或多个 s 字符
)
关闭分组构造
key
按字面意思匹配键
(.*?)
匹配 0 个或多个任意字符。这是在捕获组内。 ?
使量词变得惰性,因此它会尽可能少地匹配。
</dt>
将给出错误,因为在正则表达式中对/
的任何使用都必须转义(\/
)。将其更改为 <\/dt>
将匹配 </dt>
字面意思。
所以在更改这两个错误后,我们会得到类似:(?:s*)key(.*?)</dt>
现在可以了。但是,我不知道它是否会按照您的意愿去做,因为我几乎没有迹象表明您真正想要做什么。
【讨论】:
以上是关于无法识别的分组构造的主要内容,如果未能解决你的问题,请参考以下文章
“ValueError:无法识别的标记样式'hline'”。 Matplotlib plot() 和 scatter() 函数无法识别一堆标记
如何修复:“无法识别的令牌'无法识别':期待('true','false'或'null')”使用Horton schema-registry