簡體   English   中英

正則表達式,找不到匹配項

[英]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] 當您要匹配字符AB ,只需將它們放在字符類[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.

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