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