[英]Regular expression, not finding match
我有遍歷文件以查找日期的代碼,但未返回它找到了與我的正則表達式匹配的代碼。
碼:
std::string s(line);
std::smatch m;
std::regex e("^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$");
std::cout << "Target sequence: " << s << std::endl;
std::cout << "Regular expression: ^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$" << std::endl;
std::cout << "The following matches and submatches were found:" << std::endl;
while (std::regex_search(s, m, e)) {
for (auto x : m) std::cout << x << " ";
std::cout << std::endl;
s = m.suffix().str();
}
輸出:
Success
Target sequence: 12/28/2002 2 15 38 43 50
Regular expression: ^[0,1]?d{1}/(([0-2]?d{1})|([3][0,1]{1}))/(([1]{1}[9]{1}[9]{1
}d{1})|([2-9]{1}d{3}))$
The following matches and submatches were found:
Enter q to quit:
我的正則表達式不正確還是其他內容?
原因在於您的正則表達式以及如何指定字符串文字:
在對您的正則表達式進行任何修復之前,請嘗試將字符串文字輸出到控制台:
std::cout << "^[0,1]?\\d{1}\\/(([0-2]?\\d{1})|([3][0,1]{1}))\\/(([1]{1}[9]{1}[9]{1}\\d{1})|([2-9]{1}\\d{3}))$";
您會看到\\
丟失,而<regex>
看不到它們。
要在字符串中指定\\
,您需要對其進行轉義\\\\
。
順便說一句,在沒有專用RegExp文字的語言中,打印字符串是調試步驟之一,必須通過字符串完成構造。
您正在使用^
和$
錨定搜索。 僅當日期靠一行時,它才會找到匹配項,並且甚至不能有前導或尾隨空格。
您有很多冗余語法,例如[1]{1}
或。 可以取出具有單個字符的字符類(在正則表達式中不是特殊字符),即1{1}
。 {1}
總是多余的,即[1]{1}
可以縮短為1
。
/
不需要在字符串文字或正則表達式中進行轉義。
解決以上語法問題,並刪除^
和$
:
"[0,1]?\\\\d/(([0-2]?\\\\d)|(3[0,1]))/((199\\\\d)|([2-9]\\\\d{3}))"
到[0,1]
,您可能想要[01]
。 當您要匹配字符A
或B
,只需將它們放在字符類[AB]
放置即可。 您的[0,1]
也將匹配一個逗號,
。
您可以將()
放在([0-2]?\\\\d)
, (3[0,1])
。 年份部分相同。 外部捕獲組就足夠了。
應用以上兩點:
"[01]?\\\\d/([0-2]?\\\\d|3[01])/(199\\\\d|[2-9]\\\\d{3})"
現在,當您要提取數據時,正則表達式應該可以使用,但是如果要使用它來進行驗證,則它並不是很好。 我不知道為什么將年份限制為1990年到9999,但這可能是您的業務邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.