regex_replace由于某种原因只替换一个匹配项

ryoqjall  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(94)

使用正则表达式,我执行

#include <iostream>
#include <regex>
using namespace std;
int main()
{
    string parsed = regex_replace(
        "import core\nimport io\n",
        (regex) "(^|\r|\n|\r\n)(\\s*)import\\s(.*)\n",
        "#include \"$3.h++\"\n");
    cout << parsed << endl;
    return 0;
}

字符串
我希望输出结果是:

#include "core.h++"
#include "io.h++"


但实际上是

#include "core.h++"
import io


我哪里做错了?为什么它只取代一个事件?我的正则表达式不好吗?
我试过改变regex_constants中的match_flag_options,但是没有用

mctunoxg

mctunoxg1#

您的正则表达式有些不必要的复杂,它可能只是

regex(R"(^\s*import\s+([^\s]+)\s*$)", std::regex_constants::multiline)

字符串
请注意,我们需要传入std::regex_constants::multiline作为构造函数参数,以便^/$匹配行的开始/结束,而不是整个输入的开始/结束。
(Some我对你的正则表达式所做的更改:

  • 匹配import和单词after之间的多个空格
  • 允许在'import'字后有空格(并且在该字内不允许)
  • 不需要匹配行尾字符(也不需要在替换中包含它们!)
  • 使用raw string literal语法,这样我们就不需要对所有内容进行双重转义)

相关问题