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

时间:2012-02-03 19:55:56

标签: c++ regex tr1

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

这是我的代码

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

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

我甚至在http://gskinner.com/RegExr/上测试了它,它完全匹配块注释。问题是,块注释没有被替换。这是某种特定于TR1的错误吗?

2 个答案:

答案 0 :(得分:3)

你必须考虑到你正在做什么的层次。

  • 首先,您要在字符串文字中构建一个字符串。对于人来说,它看起来像一个正则表达式,但字符串文字并不关心。

    该字符串文字除其他外,还包含\S\s所产生的特殊字符(就像\n特殊的一样)。

  • 然后,你将这个字符串 - 特殊字符和所有字符 - 传递给正则表达式引擎。

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

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

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

[/][*][\S\s]*?[*][/]

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

答案 1 :(得分:1)

在轨道上的轻盈比赛让我沿着正确的道路前进,但结果是*和?不能用于[]括号内的参数。这样做的方法是使用具有或声明的非捕获组。

查找多行块注释的代码:

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

(?:表达式)是如何创建一个非捕获组。你可以申请*和?在那之外。在里面,使用|作为或陈述。