[英]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
ECMAScript
, awk
- 不,它不會匹配。 \\^
正在轉義^
,所以[\\^]
被解釋為[^]
(“刪除轉義字符”(即替換\\^
取^
)在“解析[
set]之前”。 ^
字符是第一個在[
括號之后的字符,所以它被解釋為“否定”(我稱之為),所以括號將匹配除列表之外的任何內容。由於列表為空[^<this list here>]
,它將除外一個空列表......好吧,它什么都不匹配。
basic
, grep
, extended
, egrep
- 它將匹配兩個字符串。 \\
松散的逃避意義] [
。 所以[\\^]
將字面上匹配\\
或^
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.