【问题标题】:Backslash in regular expression bracket expression正则表达式括号表达式中的反斜杠
【发布时间】: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++


    【解决方案1】:

    给定正则表达式“[\^]”它应该匹配字符串“\”和“^”吗?

    using std::regex_constants

    1. ECMAScript, awk - 不,它不会匹配。 \^ 正在转义^,因此[\^] 被解释为[^](“删除转义字符”(即用\^ 替换^)出现在“解析[ 集之前” . ^ 字符是[ 括号之后的第一个字符,所以它被解释为“否定”(我这样称呼它),所以括号将匹配除列表之外的任何内容。由于列表为空@987654333 @,除了一个空列表,它会匹配任何东西......好吧,它不会匹配任何东西。

    2. basic,grep, extended, egrep - 它将匹配两个字符串。 \[ 中的转义含义松散。所以[\^] 将匹配\^

    【讨论】:

    • awk 的 POSIX 规范声明“反斜杠字符后跟任何未在此表或 IEEE Std 1003.1-2001 的基本定义卷中的表中描述的字符,第 5 章,文件格式表示法 ( '\\' , '\a', '\b', '\f', '\n', '\r', '\t', '\v' ) 未定义。”插入符号不包含在表中,因此 [\^] 是 awk 语法的未定义行为。如果您查看 ECMA-262 15.10.1 的语法产生,它会强制将 [\^] 解释为从字面上匹配插入符号,因为它是 ClassAtomNoDash。它必须匹配“^”,但不能匹配“\”。
    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多