为什么这个正则表达式不适用于 c++ TR1?

Why doesn't this regex work for c++ TR1?

本文关键字:c++ TR1 适用于 不适用 正则表达式 为什么      更新时间:2023-10-16

我承认我已经有一段时间没有使用C++了,但据我所知,我的代码应该可以工作。我正在尝试从包含代码的文件中替换/删除所有块注释。我将正在搜索的整个文件放入一个字符串中,该字符串包含换行符。

这是我的代码

std::tr1::regex rx1("[/][*][Ss]*?[*][/]");
stringName = std::regex_replace(stringName, rx1, std::string(""));

据我所知,这应该匹配/*这里的任何内容,包括新行*/

我甚至在上面测试过http://gskinner.com/RegExr/,其中它与块注释完美匹配。问题是,阻止注释不会被替换。这是某种特定于TR1的错误吗?

您必须考虑到您正在做的事情有多个层次。

  • 首先,在字符串文本中构建一个字符串。对人类来说,它看起来像一个正则表达式,但字符串文字并不在乎。

    该字符串文字包含Ss分别产生的特殊字符(就像n是特殊的一样)。

  • 然后,您传递这个字符串—特殊字符和所有;到正则表达式引擎。

相反,您确实需要执行反斜杠的转义,仅用于字符串文字:

std::tr1::regex rx1("[/][*][\S\s]*?[*][/]")

正则表达式引擎将正确地看到表达式:

[/][*][Ss]*?[*][/]

此外,我会检查tr1的引擎是否需要分隔符。它们通常是个好主意。

轨道上的Lightness Races推动我沿着正确的道路前进,但结果是*和?不能用于[]括号内的参数。这样做的方法是使用一个具有或语句的非捕获组。

查找多行块注释的代码:

std::tr1::regex rx3("[/][*](?:s|.|n)*?[*][/]");

(?:expression)是如何生成一个非捕获组的。您可以应用*和?到外面去。在其内部,使用|作为或语句。