regex_replace匹配字符串的结尾两次

时间:2017-09-08 05:58:38

标签: c++ regex

考虑以下计划:

#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时,我不明白为什么最后$之后的空字符串会再次匹配。

3 个答案:

答案 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