C ++ reverse regex_search

时间:2016-10-04 21:00:12

标签: c++ regex c++11

我正在使用std :: regex,并希望找到字符串中与用户定义的正则表达式字符串匹配的最后位置。

例如,给定正则表达式:.*和字符串"测试:55:最后",我想找到":last",not":55 :最后"

为了澄清,作为用户提供的正则表达式,我只是得到他们的正则表达式加上"反向"复选框,所以我可以改变正则表达式,但它必须采用编程方式。

1 个答案:

答案 0 :(得分:3)

如果您有一个用户提供的正则表达式无法更改,但您仍然需要最右边的匹配,请使用^.*()(或[\s\S]*来匹配不同的换行符)并抓住捕获组1的内容:

"^.*(:.*)"

请参阅regex demo

事情是上面的模式匹配

  • ^ - 字符串的开头
  • .* - 匹配换行符以外的任何0+字符(如果您使用[\s\S]*,则所有字符都将匹配)尽可能多(因为{{1是一个贪婪的量词)
  • * - 匹配(:.*)的{​​{3}},然后是换行符以外的任何0 +字符。

请注意,第一个:实际上会捕获尽可能多的字符,直到行尾(并且在大多数情况下,如果没有换行符,则它是字符串的结尾)。然后发生回溯,正则表达式引擎将开始尝试适应后续子模式的文本(这里,它将是用户模式)。因此,将被捕获的用户子模式将位于最右侧位置。

capturing group显示了这可行的方法:

.*