为什么这个正则表达式不适用于 c++ TR1?
Why doesn't this regex work for c++ TR1?
我承认我已经有一段时间没有使用C++了,但据我所知,我的代码应该可以工作。我正在尝试从包含代码的文件中替换/删除所有块注释。我将正在搜索的整个文件放入一个字符串中,该字符串包含换行符。
这是我的代码
std::tr1::regex rx1("[/][*][Ss]*?[*][/]");
stringName = std::regex_replace(stringName, rx1, std::string(""));
据我所知,这应该匹配/*这里的任何内容,包括新行*/
我甚至在上面测试过http://gskinner.com/RegExr/,其中它与块注释完美匹配。问题是,阻止注释不会被替换。这是某种特定于TR1的错误吗?
您必须考虑到您正在做的事情有多个层次。
-
首先,在字符串文本中构建一个字符串。对人类来说,它看起来像一个正则表达式,但字符串文字并不在乎。
该字符串文字包含
S
和s
分别产生的特殊字符(就像n
是特殊的一样)。 -
然后,您传递这个字符串—特殊字符和所有;到正则表达式引擎。
相反,您确实需要执行反斜杠的转义,仅用于字符串文字:
std::tr1::regex rx1("[/][*][\S\s]*?[*][/]")
正则表达式引擎将正确地看到表达式:
[/][*][Ss]*?[*][/]
此外,我会检查tr1的引擎是否需要分隔符。它们通常是个好主意。
轨道上的Lightness Races推动我沿着正确的道路前进,但结果是*和?不能用于[]括号内的参数。这样做的方法是使用一个具有或语句的非捕获组。
查找多行块注释的代码:
std::tr1::regex rx3("[/][*](?:s|.|n)*?[*][/]");
(?:expression)是如何生成一个非捕获组的。您可以应用*和?到外面去。在其内部,使用|作为或语句。
相关文章:
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- TR1提供的所有东西现在都可以在C++14中使用并且易于使用吗
- Mac C++ 编译器找不到 <TR1/unordered_map>
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 对 TR1 使用 boost 时提升数学特殊函数编译错误
- std::tr1::函数和它接受的模板值
- TR1::绑定和通过引用传递,这种行为真的是预期的吗?
- 用TR1 :: Shared_ptr类型实现std ::相等
- C++, TR1, Regex and Boost
- c value_type对于std :: tr1不起作用:std :: map中的元组
- tr1::hash for uint64_t
- 擦除 std::tr1::unordered_map 中的元素
- Boost或等效于gsl_ matrix的TR1等
- xcode 4.4.1 c++11标头仍在tr1下存档
- GHashTable vs std::tr1::unordered_map
- boost::function 和 std::tr1::function 之间是否有重要的区别需要了解
- std::tr1::函数为VS2008 SP1中的x64配置提供链接错误
- std::tr1::shared_ptr and dynamic_cast
- 标准::TR1::unordered_map插入错误
- boost::hash/std::tr1::hash 不为复制的 const char* 返回相同的哈希