转义用于嵌入std :: regex的String常量

Yak*_*ont 8 c++ regex escaping c++11

C++ 11有6种不同的正则表达式语法可供使用.在我的例子中,我正在与使用修改的ECMAScript正则表达式的组件进行交互.

我需要创建一个正则表达式"匹配以X开头的字符串",其中X是我的字符串文字.

所以我想要的正则表达式是粗略的^X.*.除了字符串X可以包含更多的正则表达式特殊字符,我希望它们发生.

这意味着我真的想要^ escaped(X) .*.

现在,我可以阅读ECMAScript文档,找到具有特殊含义的所有字符,编写一个逃避它们的函数,然后完成.但这似乎不优雅,低效且容易出错 - 特别是如果我想支持当前C++支持的所有6种正则表达式,更不用说将来了.

标准中是否有一种简单的方法可以将文字字符串转换为嵌入C++正则表达式,可能是正则表达式语法的函数,还是我必须自己滚动?

下面是使用boost库的类似问题,其中转义列表是硬编码的,然后生成一个反斜杠的正则表达式.我是否已经缩减为适应该答案std

小智 1

如果您必须自己编写,那么您只需要知道两种。
BRE 和其他。

这些应该在下面起作用。使用ECMAScript类型正则表达式对输入字符串进行操作。

下面的正则表达式是使用此处的特殊字符来制定的:
在正则表达式中必须转义哪些特殊字符?
正在回答中Legacy RegEx Flavors (BRE/ERE)

两者都使用相同的替换:"\\\\$1"

对于BRE输入:

 # "(\\\\[+?(){}|]|[.^$*\\[\\]\\\\-])"


 (                             # (1 start)
      \\ [+?(){}|]             # not sure this is needed (its not needed)
   |  
      [.^$*\[\]\\-] 
 )                             # (1 end)
Run Code Online (Sandbox Code Playgroud)

对于EREECMAScript输入:

 # "([.^$*+?()\\[\\]{}\\\\|-])"

 ( [.^$*+?()\[\]{}\\|-] )      # (1)
Run Code Online (Sandbox Code Playgroud)

BRE 输入示例

前 -

+_)(*&^%$#@!asdfasfd hello
+ ? ( ) { } |
\+ \? \( \) \{ \} \|
\\+ \\? \\( \\) \\{ \\} \\|
}{":][';/.,<>? 
here is
Run Code Online (Sandbox Code Playgroud)

后 -

+_)(\*&\^%\$#@!asdfasfd hello
+ ? ( ) { } |
\\+ \\? \\( \\) \\{ \\} \\|
\\\\+ \\\\? \\\\( \\\\) \\\\{ \\\\} \\\\|
}{":\]\[';/\.,<>? 
here is
Run Code Online (Sandbox Code Playgroud)