【发布时间】:2019-04-26 18:16:12
【问题描述】:
给定正则表达式“[\^]”它应该匹配字符串“\”和“^”吗?
我对相关 C++、POSIX 和 ECMAScript 标准的阅读是,对于 POSIX(基本、扩展、awk、gre 和 egrep)语法,正则表达式应该匹配两个字符串,而对于 ECMAScript 语法,只有第二个字符串应该匹配。
ERE 的 POSIX 引用以及 awk、grep 和 egrep 实用程序都遵循 BRE 规范 (XBD 9.3.5/1),其中明确指出“特殊字符 '.'、'*'、'[' 和 '\ '(句点、星号、左括号和反斜杠)在括号表达式中将失去其特殊含义。”所以我将其解释为反斜杠在括号表达式中只是一个反斜杠。
ECMAScript specification 没有“失去其特殊含义”规则,而是指定后跟非字母数字字符的反斜杠就是字符本身。
无论选择何种正则表达式语法,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);
}
我的期望有错吗?如果没有,哪个标准库实现是正确的?
【问题讨论】:
标签: c++