c++ - 仅查找第一个 std::regex 有效匹配

标签 c++ regex c++17 lexer

我正在尝试找到一种有效的方法来贪婪地找到 std::regex 的第一个匹配项,而无需分析整个输入。

我的具体问题是我写了一个手工制作的词法分析器,我试图提供规则来解析常见的文字值(例如数值)。

所以假设一个简单的假设

std::regex integralRegex = std::regex("([+-]?[1-9]*[0-9]+)");

有没有办法在不扫描所有输入的情况下找到从输入开始的最长匹配?看起来 std::regex_match 试图匹配整个输入,而 std::regex_search 强行找到所有匹配项。

也许出于我的目的我错过了一个微不足道的重载,但我找不到解决问题的有效方法。

只是为了澄清这个问题:我对在第一次子匹配后停止并忽略输入的其余部分不感兴趣,但对于像 "51+12*3" 这样的输入我想要找到第一个 51 匹配然后停止的东西,忽略后面的任何东西。

最佳答案

首先 [+-]?[1-9]?[0-9]+ 我认为它的想法是一样的,但应该快一点。或者您打算使用类似这样的东西:[+-]?[1-9][0-9]*|0(没有符号的零或不以零开头的数字)。

其次C++提供了正则表达式迭代器:

const std::string s = "51+12*3";

std::regex number_regex("[+-]?[1-9]?[0-9]+");
auto words_begin = 
    std::sregex_iterator(s.begin(), s.end(), number_regex);
auto words_end = std::sregex_iterator();

std::cout << "Found " 
          << std::distance(words_begin, words_end) 
          << " numbers:\n";

for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
    std::smatch match = *i;                                                 
    std::string match_str = match.str(); 
    std::cout << match_str << '\n';
} 

看起来这就是您所需要的。

https://wandbox.org/permlink/tkaAfIslkWeY2poo

关于c++ - 仅查找第一个 std::regex 有效匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54558461/

相关文章:

c++ - opencv的private.hpp是什么??哪个模块包含 private.hpp 文件?

javascript - 如何计算 pi (π) 的近似值与其实际值之间的相同位数?

regex - 如何否定整个正则表达式?

Notepad++中的正则表达式以删除空行

c++ - 使用 std::variant 的递归 typedef 定义

c++ - C++ 临时变量应该保持不变吗?

c++ - 更改资源管理器数据提供者的类别

c++ - 如何在boost regex_search中获取原始字符串前缀

c++ - 如何让map.emplace在c++17中自动选择构造函数?

c++ - 下标运算符中的逗号运算符?