给定正则表达式“[\ ^]”它应该匹配字符串“\”和“^”吗?
我对相关C ++,POSIX和ECMAScript标准的阅读是针对POSIX(基本,扩展,awk,gre和egrep)语法,正则表达式应匹配两个字符串,而对于ECMAScript语法,只应匹配第二个字符串。
对于ERE以及awk,grep和egrep实用程序的POSIX引用都遵循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);
}
我的期望是错误的,如果没有,哪个标准库实现是正确的?
给定正则表达式“[\ ^]”它应该匹配字符串“\”和“^”吗?
using std::regex_constants
ECMAScript
,awk
- 不,它不会匹配。 \^
逃脱^
,因此[\^]
被解释为[^]
(“删除逃脱字符”(即用\^
代替^
)在“解析[
集”之前出现.^
字符是[
括号之后的第一个字符,所以它被解释为“否定”(我称之为),所以括号将匹配除列表之外的任何内容。由于列表为空[^<this list here>]
,除了空列表之外它将是任何东西......好吧,它什么都不匹配。basic
,grep
,extended
,egrep
- 它将匹配两个字符串。 \
在[
内松散逃脱意义。所以[\^]
将真正匹配\
或^
。