我正在尝试找到一种有效的方法来贪婪地找到 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';
}
看起来这就是您所需要的。
关于c++ - 仅查找第一个 std::regex 有效匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54558461/