[英]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:]]?
: 正則表達式從行首開始,並正在尋找匹配小寫或不匹配的內容。 第一個字符 ( '_'
) 不是小寫字符,因此默認為空 ( ?
)。 接下來可能會發生以下兩種情況之一:
/[[:lower:]]?/
),正則表達式會在找到后立即返回匹配項( ""
)。 請參閱regex101.com上的示例或查看下圖開頭的紫色小線:/[[:lower:]]?/g
)后,正則表達式會繼續搜索匹配項,直到 string 用完,然后返回一個匹配項數組。 請參閱regex101.com上的示例或查看多條紫色線(匹配結束位置)和藍色高光(匹配):希望這可以幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.