簡體   English   中英

正則表達式括號表達式中的反斜杠

[英]Backslash in regular expression bracket expression

給定正則表達式“[\\ ^]”它應該匹配字符串“\\”和“^”嗎?

我對相關C ++,POSIX和ECMAScript標准的閱讀是針對POSIX(基本,擴展,awk,gre和egrep)語法,正則表達式應匹配兩個字符串,而對於ECMAScript語法,只應匹配第二個字符串。

對於ERE以及awk,grep和egrep實用程序的POSIX引用都遵循BRE規范( XBD 9.3.5 / 1 ),明確說明“特殊字符”。','*','['和'\\ '(句號,星號,左括號和反斜杠)將在括號表達式中失去其特殊含義。“ 所以我認為這意味着一個反斜杠只是一個括號表達式內的反斜杠。

ECMAScript規范沒有“失去其特殊含義”規則,而是指定反斜杠后跟非字母數字字符只是字符本身。

無論選擇何種正則表達式語法,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

  1. ECMAScriptawk - 不,它不會匹配。 \\^正在轉義^ ,所以[\\^]被解釋為[^] (“刪除轉義字符”(即替換\\^^ )在“解析[ set]之前”。 ^字符是第一個在[括號之后的字符,所以它被解釋為“否定”(我稱之為),所以括號將匹配除列表之外的任何內容。由於列表為空[^<this list here>] ,它將除外一個空列表......好吧,它什么都不匹配。

  2. basicgrepextendedegrep - 它將匹配兩個字符串。 \\松散的逃避意義] [ 所以[\\^]將字面上匹配\\^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM