考虑以下程序:
#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,因此首先不匹配任何内容并放置一个 b,然后匹配该 b 并放置第二个 b。请确保您使用的是gcc 7.1.0或clang 3.0或更高版本。 - Shakiba Moshiri$
之后仍然有剩余内容需要匹配,我看不出它如何发挥作用。 - SU3