C++ reverse regex_search
C++ reverse regex_search
我正在使用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;
}
相关文章:
- 此模式的C++RegEx
- QTableview Search
- LeetCode 1011.Binary Search,C++和Python的想法相同,但输出不同
- C++ std::regex 使用前瞻失败
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 二叉搜索树 - 实现"search"函数
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- 使用Regex解析cpp中的字符串并创建映射
- C++:如何用split查找单词?Regex
- 在VC2015U3上,std::regex比boost::regex慢得多
- 是否有更有效的方法来生成日期的REGEX字符串
- 在C++中使用带有regex的捕获组
- 将std::regex设置为静态的好主意吗
- 为什么Regex(c++)需要指数时间
- std::regex and dual ABI
- C++11 std::regex后备选项
- 以不同的方式替换每一项,regex c++
- 使用 boost::regex (c++) 比较两个正则表达式
- 如何理解boost::regex的哪一部分未能匹配/search