今天代碼中遇到使用正則表達式匹配一個文件路徑的問題,需要驗證傳入的文件路徑是否合法,學習了簡單的正則表達式的寫法后,簡單寫了如下代碼,在網上找了一些在線測試正則表達式的網站,測試可以通過。
std::regex match("^[a-zA-Z]:(\\[a-zA-Z0-9]+)+$");
std::string path("D:\\test");
if (!std::regex_match(path, match)) {
cout << "!!!" << endl;
}
但是整到C++里面后,結果報錯了,報錯原因是regex_error caught: regex_error(error_brack): The expression contained mismatched [ and ].
我開始懷疑是不是正則表達式在\\[
部分把\\[
組合在了一起,我的本意是匹配一個\
字符結果卻變成了匹配一個[
字符,導致方括號表達式只剩下右半邊所以報錯。
本身C++用\
來當做轉義符,則\\
表示一個正常的\
,如果放在正則表達式中的話,\\
表示一個\
字符,那么在C++中可能\\\\
才是匹配\
的正確做法
有點繞,首先先用C++的思路轉換字符串為正則表達式,然后再按照正則表達式語法解析,有點不適合閱讀,不知道有什么方法,可以讓這種寫法變得更加可讀方便維護。
最后的調整算是可以比較正常工作的是如下的表達式,還是不夠完善,還在改善
try {
std::regex match("^[a-zA-Z]:(\\\\[a-zA-Z0-9]+)+$");
std::string path("D:\\test");
if (!std::regex_match(path, match)) {
cout << "!!!" << endl;
}
}
catch (const std::regex_error& e) {
std::cout << "regex_error caught: " << e.what() << '\n';
}