我承认自从我使用C ++以来已经有一段时间了,但据我所知,我的代码应该可行。我正在尝试替换/删除包含代码的文件中的所有块注释。我将我正在搜索的整个文件放入一个字符串中,该字符串包含换行符。
这是我的代码
std::tr1::regex rx1("[/][*][\S\s]*?[*][/]");
stringName = std::regex_replace(stringName, rx1, std::string(""));
据我所知,这应该匹配/ *中的任何内容,包括新行* /
我甚至在http://gskinner.com/RegExr/上测试了它,它完全匹配块注释。问题是,块注释没有被替换。这是某种特定于TR1的错误吗?
答案 0 :(得分:3)
你必须考虑到你正在做什么的层次。
首先,您要在字符串文字中构建一个字符串。对于人来说,它看起来像一个正则表达式,但字符串文字并不关心。
该字符串文字除其他外,还包含\S
和\s
所产生的特殊字符(就像\n
特殊的一样)。
然后,你将这个字符串 - 特殊字符和所有字符 - 传递给正则表达式引擎。
相反,您需要执行反斜杠的转义,仅用于字符串文字:
std::tr1::regex rx1("[/][*][\\S\\s]*?[*][/]")
正则表达式引擎将正确地看到表达式:
[/][*][\S\s]*?[*][/]
另外,我会检查tr1的引擎是否需要分隔符。他们通常是个好主意。
答案 1 :(得分:1)
查找多行块注释的代码:
std::tr1::regex rx3("[/][*](?:\s|.|\n)*?[*][/]");
(?:表达式)是如何创建一个非捕获组。你可以申请*和?在那之外。在里面,使用|作为或陈述。