Boost正则表达式不替换正则表达式网站上正确替换的表达式

Boost regex not replacing expression that replaces correctly on regex websites

本文关键字:替换 正则表达式 表达式 网站 Boost      更新时间:2023-10-16

我试图用boost::regex替换regex,但似乎不起作用。

下面是正则表达式:

(\w+,\d+,\d+,\d+tscriptt)(.+)(#)(.+)(t\d+(,\d+)?(,\d+)?,{)

格式化程序:

$1"$2"$3"$4"$5

代码:(getInput()返回一个字符串,其中的内容应该匹配)

std::string &Preprocessor::preprocess()
{
    std::string &tempString = getInput();
    boost::regex scriptRegexFullName;
    const char *scriptRegexFullNameReplace = "$1"$2"$3"$4"$5";
    scriptRegexFullName.assign("(\w+,\d+,\d+,\d+tscriptt)(.+)(#)(.+)(t\d+(,\d+)?(,\d+)?,{)");
    tempString = boost::regex_replace(tempString, scriptRegexFullName, scriptRegexFullNameReplace, boost::match_default);
    return tempString;
}

当我把以下测试用例放在这个网站上时:

alberta,246,82,3    script  Marinheiro#bra2 100,{
brasilis,316,57,3   script  Marinheiro#bra1 100,{
brasilis,155,165,3  script  Orientação divina#bra1  858,{

网站的输出是正确的:

alberta,246,82,3    script  "Marinheiro"#"bra2" 100,{
brasilis,316,57,3   script  "Marinheiro"#"bra1" 100,{
brasilis,155,165,3  script  "Orientação divina"#"bra1"  858,{

但使用boost::regex,输出为:

alberta,246,82,3    script  "Marinheiro#bra2    100,{
brasilis,316,57,3   script  Marinheiro#bra1 100,{
brasilis,155,165,3  script  Orientação divina#bra1  858,{

谁知道我做错了什么?

谢谢你的帮助。

问题来自你的第一个(.+),它很贪婪,可能会抓住所有他能抓住的东西,直到主题字符串的最后一个#

你可以试试这个模式:

const char *scriptRegexFullNameReplace = "$1"$2"#"$3"$4";
scriptRegexFullName.assign("(\p{L}+,\d+,\d+,\d+\s+script\s+)([^#]+)#(\S+)(\s+\d+,\{)");

注意事项:

  • 花括号的转义可能是非种子的,请尝试将其删除
  • p{L}代表任何unicode字母,但如果有问题,您可以尝试用[^,]替换它
  • 您可以用++替换所有+以获得更多性能(不允许回溯)
  • 不需要捕捉尖锐的东西来代替它,这就是为什么图案只有四个捕捉组的原因
  • 与其使用(.+?)(带有惰性量词的点),不如使用具有缩减字符类的贪婪量词:[^#],它将匹配所有字符,直到第一个#