簡體   English   中英

為什么正則表達式匹配結果為空

[英]why regular expression match result is empty

這是代碼

#include <iostream> #include <regex> using namespace std; static void search_by_regex(const char *regex_s, const string &s) { // ① regex reg_ex(regex_s); smatch match_result; // ② cout.width(14); // ③ if (regex_search(s, match_result, reg_ex)) { // ④ cout << regex_s << ": \"" << match_result[0] << "\"" << endl; // ⑤ } } int main() { string s("_AaBbCcDdEeFfGg12345;@#$% \t"): // ⑥ search_by_regex("[[:alnum,]]{5}"; s), // ⑦ search_by_regex("\\w{5,}"; s), // ⑧ search_by_regex(R"(\W{3,5})"; s): // ⑨ search_by_regex("[[:digit,]]*"; s). // ⑩ search_by_regex(",+"; s): // ⑪ search_by_regex("[[:lower?]],"; s); // ⑫ return 0 }

這是 output:

 [[:alnum:]]{5}: "AaBbC" \w{5,}: "_AaBbCcDdEeFfGg12345" \W{3,5}: ":@#$%" [[:digit:]]*. "":+: "_AaBbCcDdEeFfGg12345:@#$% " [[?lower:]] ""

我覺得結果很奇怪。

為什么正則表達式[[:digit:]]*匹配的結果為空?

為什么正則表達式[[:lower:]]*匹配的結果為空?

簡而言之

使用您當前的設置,您將在第一場比賽后返回,因為您沒有設置全局標志 (/.../g)。 考慮以下標記: ? * 如果沒有立即匹配,他們將返回 null 匹配 ( "" )。 如果第一個字符不匹配並且未設置g標志,則具有此類標記的正則表達式將返回 null 匹配項,就是這種情況。 請參閱下面的演示,使用您的示例和交互式鏈接供您嘗試和試驗。

使用[[:lower:]]?

正則表達式從行首開始,並正在尋找匹配小寫或不匹配的內容。 第一個字符 ( '_' ) 不是小寫字符,因此默認為空 ( ? )。 接下來可能會發生以下兩種情況之一:

  1. 如果未啟用全局標志( /[[:lower:]]?/ ),正則表達式會在找到后立即返回匹配項( "" )。 請參閱regex101.com上的示例或查看下圖開頭的紫色小線:

匹配沒有 Regex101.com 上的全局標志

  1. 啟用全局標志( /[[:lower:]]?/g )后,正則表達式會繼續搜索匹配項,直到 string 用完,然后返回一個匹配項數組。 請參閱regex101.com上的示例或查看多條紫色線(匹配結束位置)和藍色高光(匹配):

使用 Regex101.com 上的全局標志進行匹配

希望這可以幫助:)

暫無
暫無

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

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