1

我试图用 boost::regex 进行正则表达式替换,但它似乎不起作用。

这是正则表达式:

(\\w+,\\d+,\\d+,\\d+\tscript\t)(.+)(#)(.+)(\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+\tscript\t)(.+)(#)(.+)(\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,{

我做错了什么,有人知道吗?

谢谢您的帮助。

4

1 回答 1

2

问题来自你的第一个(.+)贪婪并抓住他能抓住的一切,可能直到#主题字符串的最后一个。

你可以试试这个模式:

const char *scriptRegexFullNameReplace = "$1\"$2\"#\"$3\"$4";

scriptRegexFullName.assign("(\\p{L}+,\\d+,\\d+,\\d+\\s+script\\s+)([^#]+)#(\\S+)(\\s+\\d+,\\{)");

注意事项:

  • 花括号的转义可能是不需要的,请尝试将其删除。
  • p{L}代表任何 unicode 字母,但[^,]如果有问题,您可以尝试将其替换为
  • 您可以全部替换+++更多表演(不允许回溯)
  • 不需要捕捉尖来自行替换,这就是图案只有四个捕捉组的原因
  • 而不是使用(.+?)(带有惰性量词的点),最好使用具有简化字符类的贪婪量词:[^#]这将匹配所有字符,直到第一个#
于 2013-08-11T02:36:55.163 回答