给出正则表达式“ [\ ^]”,使其与字符串“ \”和“ ^”匹配吗?
我对相关的C ++,POSIX和ECMAScript标准的了解是,对于POSIX(基本,扩展,awk,gre和egrep)语法,正则表达式应匹配两个字符串,而对于ECMAScript语法,仅应匹配第二个字符串被匹配。
用于ERE的POSIX参考以及awk,grep和egrep实用程序均遵循BRE规范(XBD 9.3.5/1),该规范明确表示“特殊字符'。','*','['和“ \”(句号,星号,左括号和反斜杠分别)在括号表达式中将失去其特殊含义。”因此我将其解释为意味着反斜杠在方括号表达式中只是一个反斜杠。
ECMAScript specification没有“失去其特殊含义”规则,而是指定反斜杠后跟非字母数字字符只是字符本身。
无论选择的regex语法如何,GCC标准库(libstdc ++)都不匹配任何字符串。 LLVM标准库(libc ++)与ECMAScript语法符合我的期望,但是在使用任何其他语法(“无效的转义字符”)构造正则表达式时会引发异常。
这是一些代码。
#include <iostream>
#include <regex>
#include <string>
void
do_match(std::string const& label, std::regex_constants::syntax_option_type type)
{
try {
std::regex re("[\\^]*", type);
std::cmatch m;
if (std::regex_match("\\^", m, re)) {
for (auto res: m) {
std::cerr << label << " match: " << res << "\n";
}
} else {
std::cerr << label << " no match\n";
}
} catch (std::regex_error const& ex) {
std::cerr << "caught exception: " << ex.what() << "\n";
}
}
int
main()
{
do_match("awk", std::regex_constants::awk);
do_match("ecma", std::regex_constants::ECMAScript);
}
我的期望是错误的吗?如果不是,那么哪个标准库实现是正确的?
答案 0 :(得分:0)
给出正则表达式“ [\ ^]”,使其与字符串“ \”和“ ^”匹配吗?
using std::regex_constants
ECMAScript
,awk
-不,它将不匹配。 \^
正在转义^
,因此[\^]
被解释为[^]
(“删除转义字符”(即用\^
代替{{1 }})位于“解析^
集之前)。[
字符是^
括号之后的第一个字符,因此它被解释为“否定”(我这样称呼它),
[
,[^<this list here>]
,basic
,grep
-它将匹配两个字符串。 extended
内部的egrep
逸出转义。因此,\
实际上会匹配[
或[\^]
。