C++ reverse regex_search

C++ reverse regex_search

本文关键字:search regex reverse C++      更新时间:2023-10-16

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

例如给定正则表达式:.*和字符串"test:55:last",我想找到":last",而不是":55:last"。

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

如果您有用户提供的无法更改的正则表达式,但您仍然需要最右边的匹配,使用^.*()(或[sS]*以跨换行匹配)包装模式并捕获第1组内容:

"^.*(:.*)"

查看regex演示

问题是上面的模式匹配
  • ^ -字符串
  • 开始
  • .* -匹配除换行符以外的任何0+字符(如果您使用[sS]*,将匹配所有字符)尽可能多的(因为*是贪婪量词)
  • (:.*) -一个捕获组,匹配:和除换行符以外的任何0+字符。

注意,第一个.*实际上会抓取尽可能多的字符,直到行尾(在大多数情况下,如果没有换行符,它就是字符串的末尾)。然后回溯发生,regex引擎将开始尝试为后续子模式(在这里,它将是用户模式)容纳文本。因此,被捕获的用户子模式将位于最右边的位置。

一个(基本的)c++程序示例,展示了这是如何工作的:

#include <regex>
#include <string>
#include <iostream>
using namespace std;
int main() {
    string user_pattern(":.*");
    string s("test:55:last");
    regex r("^.*(" + user_pattern + ")");
    smatch matches;
    if (regex_search(s, matches, r)) {
        cout<<matches[1].str();
    }
    return 0;
}