正则表达式括号表达式中的反斜杠

时间:2019-04-26 18:16:13

标签: c++

给出正则表达式“ [\ ^]”,使其与字符串“ \”和“ ^”匹配吗?

我对相关的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);
}

我的期望是错误的吗?如果不是,那么哪个标准库实现是正确的?

1 个答案:

答案 0 :(得分:0)

  

给出正则表达式“ [\ ^]”,使其与字符串“ \”和“ ^”匹配吗?

using std::regex_constants

  1. ECMAScriptawk-不,它将不匹配。 \^正在转义^,因此[\^]被解释为[^](“删除转义字符”(即用\^代替{{1 }})位于“解析^集之前)。[字符是^括号之后的第一个字符,因此它被解释为“否定”(我这样称呼它),

  2. [[^<this list here>]basicgrep-它将匹配两个字符串。 extended内部的egrep逸出转义。因此,\实际上会匹配[[\^]