考虑以下计划:
#include <iostream>
#include <regex>
int main(int argc, char* argv[]) {
if (argc==4)
std::cout << std::regex_replace(
argv[1], std::regex(argv[2]), argv[3]
) << std::endl;
}
运行
./a.out a_a_a '[^_]+$' b
给出预期结果a_a_b
。但是运行
./a.out a_a_a '[^_]*$' b
打印a_a_bb
。
boost::regex_replace
具有相同的行为。
当我已经消耗a
时,我不明白为什么最后$
之后的空字符串会再次匹配。
答案 0 :(得分:1)
*
量词和+
量词之间的区别很简单。 *
匹配结束字母a
以及末尾的零宽度。
你可以在这里看到:
[^_]*$
不仅匹配上一个a
,还匹配之后的零宽度,因此结果将是a_a_bb
为确保以这种方式运作,请尝试:
[^_]*
如果你输入程序a_a_a
,输出将是:
bb_bb_bb
[^_]*
请注意,模式[^_]
匹配所有三个a
,但只要在此模式后面加上星号*
,它就会生成模式:匹配单个a或者没有(=零宽度)因此针对主题[^_]*
的模式a_a_a
匹配 6 点:a
和{{1}之间}和a
等等。
_
答案 1 :(得分:1)
锚点不会被消耗(因为它们是0宽度)。
你可以尝试使模式abc$$$
与字符串abc
匹配,它仍然匹配,模式^^^abc
也是如此。因此,您的函数中的$
不会消耗,并且允许a$
和(empty)$
匹配。
答案 2 :(得分:0)
我想因为
+ means 1 or many (at least one occurrence for the match to succeed)
* means 0 or many (the match succeeds regardless of the presence of the search string)
因此,[^_]+$
仅匹配一个[^_]*$
匹配a和空字符,因此它会生成一个双b
。