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

问题描述 投票:3回答:1

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

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

我的期望是错误的,如果没有,哪个标准库实现是正确的?

c++
1个回答
0
投票

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

using std::regex_constants

  1. ECMAScriptawk - 不,它不会匹配。 \^逃脱^,因此[\^]被解释为[^](“删除逃脱字符”(即用\^代替^)在“解析[集”之前出现.^字符是[括号之后的第一个字符,所以它被解释为“否定”(我称之为),所以括号将匹配除列表之外的任何内容。由于列表为空[^<this list here>],除了空列表之外它将是任何东西......好吧,它什么都不匹配。
  2. basicgrepextendedegrep - 它将匹配两个字符串。 \[内松散逃脱意义。所以[\^]将真正匹配\^
© www.soinside.com 2019 - 2024. All rights reserved.