C++ 用于嵌入std::regex的转义字符串常量

C++ 用于嵌入std::regex的转义字符串常量,c++,regex,c++11,escaping,C++,Regex,C++11,Escaping,C++11有6种不同的正则表达式语法可供使用。在我的例子中,我正在与使用修改过的ECMAScript正则表达式的组件交互 我需要创建一个正则表达式“匹配以X开头的字符串”,其中X是我拥有的字符串文本 所以我想要的正则表达式大致是^X.*。除了字符串X可以包含更多正则表达式特殊字符之外,我希望它们出现 这意味着我真的想要^转义(X)。* 现在,我可以阅读ECMAScript文档,找到所有具有特殊含义的字符,编写一个转义函数,然后完成。但这似乎不优雅、效率低、容易出错——特别是如果我想支持C++支持

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

我需要创建一个正则表达式“匹配以X开头的字符串”,其中X是我拥有的字符串文本

所以我想要的正则表达式大致是
^X.*
。除了字符串X可以包含更多正则表达式特殊字符之外,我希望它们出现

这意味着我真的想要
^转义(X)。*

现在,我可以阅读ECMAScript文档,找到所有具有特殊含义的字符,编写一个转义函数,然后完成。但这似乎不优雅、效率低、容易出错——特别是如果我想支持C++支持的所有6种正则表达式,更别说在将来。 <> P>有一种简单的方法来逃避文字字符串嵌入C++正则表达式中,可能是正则表达式语法的函数,还是我必须自己滚动?


在boost库中也是一个类似的问题,其中转义列表是硬编码的,然后生成一个正则表达式来反斜杠。我是否已经适应了将这个答案用于
std

如果你必须自己写,你只需要知道两种。
布雷和其他人

这些应该在下面起作用。使用ECMAScript键入regex对输入字符串进行操作

下面的正则表达式使用此处的特殊字符表示:

在回答
Legacy RegEx Flavors(BRE/ERE)

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

对于BRE输入:

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


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

 ( [.^$*+?()\[\]{}\\|-] )      # (1)
对于EREECMAScript输入:

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


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

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

BRE输入示例:

在—

+_)(*&^%$#@!asdfasfd hello
+ ? ( ) { } |
\+ \? \( \) \{ \} \|
\\+ \\? \\( \\) \\{ \\} \\|
}{":][';/.,<>? 
here is
(*&^%$#@!asdfasfd你好 + ? ( ) { } | \+ \? \( \) \{ \} \| \\+ \\? \\( \\) \\{ \\} \\| }{":][';/.,? 这是 在-

+_)(\*&\^%\$#@!asdfasfd hello
+ ? ( ) { } |
\\+ \\? \\( \\) \\{ \\} \\|
\\\\+ \\\\? \\\\( \\\\) \\\\{ \\\\} \\\\|
}{":\]\[';/\.,<>? 
here is
+\(\*&\^%\$\\\\@!asdfasfd你好
+ ? ( ) { } |
\\+ \\? \\( \\) \\{ \\} \\|
\\\\+ \\\\? \\\\( \\\\) \\\\{ \\\\} \\\\|
}{":\]\[';/\.,? 
这是
(回答了很久,所以OP可能已经解决了一些问题,但仍然如此)

初步评论:在ECMAScript(可能还有其他)语法中,您需要的正则表达式是
^X
,之后不需要额外的
*

关于这个任务的方法:你需要一个通用的解决所有正则表达式语法的方法。嗯,<强> yaGiNi>强>。除非你编写一个支持所有C++ ReXEP语法的通用库,否则不要试图自己解决这个世界的问题。Ce你写了你的问题,额外的ReXEP语法选项已经被添加到C++……所以,C++ 17,它是,嗯,10我想。 因此,我建议您编写一些有可能扩展到其他语法选项的内容,但目前只适用于您需要的语法选项。例如:

template <std::regex::syntax_option_type SyntaxOption>
std::string escape_for_regex(const std::string_view sv);

将它移到C++,并用函数签名的第一个选项,这就变成:

template <>
std::string escape_for_regex<std::regex::ECMAScript>(const std::string_view sv)
{
    const std::regex to_escape("[-/\\\\^$*+?.()|[\\]{}]");
    const std::string escaped("\\$1");
    const std::string s{sv};
    return std::regex_replace(s, to_escape, escaped);
}
模板
正则表达式的std::string转义(const std::string\u view sv)
{
const std::regex to_escape(“[-/\\\^$*+?。()”;[\\]{}]”;
常量std::字符串转义(\\$1);
常量std::字符串s{sv};
返回std::regex_replace(s,to_escape,escape);
}

警告:我还没有正确地测试过这个。我也不喜欢额外的字符串结构,所以可能还有另一个
regex\u replace
变体可以使用。

中的答案实际上是你需要的。为什么你需要转义它。如果X是一个字符串,你不能通过连接来创建你的regex,比如
“^”+X+”
@stribizhev,这意味着为6种正则表达式格式中的每种格式以及任何新格式编写自定义版本。@GlasG因为
X
可能是
“这是一个*********问题”——以及<>代码> 和 */<代码>不应被解释为正则表达式命令。是的,确切地说。Boost ReGEX不会为您做。在.NET中(例如C++,VB.NET),很清楚:使用<代码>正则表达式。逃逸< /代码>。在C++中,没有这样的函数。