gpt4 book ai didi

C++ 反向 regex_search

转载 作者:行者123 更新时间:2023-11-30 02:29:10 31 4
gpt4 key购买 nike

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

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

澄清一下,作为用户提供的正则表达式,我只得到他们的正则表达式加上一个“反向”复选框,这样我就可以更改正则表达式,但它必须以编程方式进行。

最佳答案

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

"^.*(:.*)"

参见 regex demo

问题是上面的模式匹配

  • ^ - 字符串的开始
  • .* - 匹配除换行符以外的任何 0+ 个字符(如果您使用 [\s\S]*,将匹配所有字符)尽可能多(因为*是一个贪心量词)
  • (:.*) - capturing group匹配 : 然后是换行符以外的任何 0+ 个字符。

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

example (basic) C++ program显示这是如何工作的:

#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;
}

关于C++ 反向 regex_search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39861652/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com