无法识别的分组构造

时间:2018-01-06 13:49:34

标签: c# .net regex match

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

  

无法识别的分组构造

我的代码:

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

Key是第一个已知的字符串,</dt>是第二个。

我不明白这里有什么不对?

3 个答案:

答案 0 :(得分:1)

这种模式无法编译。您需要使用/转义\。 其次,添加,您需要为组添加名称:

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

如果您想要按字面意思匹配,则还需要转义</>

Regex101是试用Regex的好网站。它将详细描述您的模式,并指出任何错误。

答案 1 :(得分:0)

我测试了你的正则表达式,它确实没有用。注意:

  • (?s*):如果您想要捕获此群组,则您必须要删除 ?或添加组名称,例如(?<g1>s*)
  • (?<g1>s*):匹配char s的0到N倍的字符串,这是你真正想要的吗?
  • </dt>:/应该像<\/dt>
  • 一样进行转义

这是我在字符串ssssskeySomething</dt>上尝试的正则表达式:

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

如果你想在key之前和</td>之前捕获一个未知的字符串,那么它应该是这样的(在SomethingkeySomething</dt>上测试):

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

答案 2 :(得分:0)

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

修复此组构造后,虽然仍然存在未转义/字符的问题,因此这也会返回错误。

让我们一步一步地分解正在发生的事情:

(?s*)key(.*?)</dt>正是您要搜索的内容。

(?不是有效的分组构造,也是您收到错误的原因。根据您尝试执行的操作,您可以通过将?或非捕获组更改为(?:或者尝试执行不同的操作来将其更改为捕获组它可能需要完全不同的改变。如果不知道你究竟想要什么,我真的不能说更多。

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

)关闭分组构造

key按字面意思匹配

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

</dt>会出错,因为必须在正则表达式中使用/进行转义(\/)。将此更改为<\/dt>将与字面上的</dt>匹配。

因此,在更改这两个错误之后,我们会得到类似的结果:(?:s*)key(.*?)</dt>

这现在有效。但是,我不知道它是否符合您的要求,因为我几乎没有迹象表明您真正想要做什么。