2017-02-04 65 views
2

我試圖做一時間有些輸入驗證格式複雜regex_match不工作在C++

"1:00 to 12:59 and AM/PM" 

我創造了這個正則表達式:\b((1[0-2]|0?[1-9]):([0-5][0-9]) *([AaPp][Mm]))。 我在regexr.com上測試過它,它工作正常。

然而,當我嘗試做這樣的事情:

std::string s ("1:00 AM"); 
std::regex e ("\b((1[0-2]|0?[1-9]):([0-5][0-9]) *([AaPp][Mm]))"); 

if (std::regex_match (s,e)) 
    std::cout << "string object matched\n"; 

它永遠不會奏效。任何想法我可能做錯了什麼?

+0

這個怎麼樣? '([0-1]?[0-2]:[0-5] [0-9] \ s * [AaPp] [mm])' – MYGz

+0

不起作用。不知道爲什麼。雖然你的正則表達式在regexr.com上工作正常!這可能與轉義字符有關嗎?原因在於 \你必須用 \\ s來逃脫它嗎? –

+0

感謝@MYGz,它只是通過將\ s *改爲空格*而工作。也許它與字符串中的轉義字符有關。 –

回答

2

感謝@MYGz我能解決這個問題。也許這與逃生角色有關。

我所做的所有改變@ MYGz的建議是刪除\ s。

它曾與([0-1]?[0-2]:[0-5][0-9] *[AaPp][Mm])

+1

'([0-1]?[0-2 ]:[0-5] \ d * [AaPp] [Mm])'3個字符以內:) – MYGz

2

使用原始字符串字面R使用單\。提前負面找0:00或00:00,而無需耗費 -

R"(?!0:00|00:00)([0-1]?[0-2]:[0-5]\d\s*[AaPp][Mm])" 

(?!0:00|00:00):您可以嘗試像這樣。

演示:

https://regex101.com/r/t7Oa0Q/2