2013-08-03 160 views
1

我一直被困在這個陌生的STD:wregex行爲:奇怪的std :: wregex行爲

^(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$ 

引發異常與

e.code() == regex_constants::error_brack 

奇怪的是,我一直在測試它與在線ECMAScript正則表達式驗證器沒有任何問題。另外事實上,刪除第一對括號如下。

^(?:(?:\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$ 

實際上解決了問題,而沒有任何特別考慮到托架的不匹配。

任何人都有這種行爲的解釋?

編輯:

似乎連L 「[^ \ u0000- \ u001f]」 不工作。

編輯:

我跑在編譯的樣本和執行,並沒有注意到它使用GCC。加上MVSC似乎是GCC給我一個運行時錯誤(例外)的事實。

+0

這並不是說這會破壞模式,但爲什麼你的角色類包含兩個文字反斜槓? (''''''在'''之前和'/'之後) –

+0

正則表達式是格式化的,因此它適用於c代碼。所以\\\\事實上\\就像普通的正則表達式一樣。第二個是正則表達式的轉義序列 –

+0

我知道四個反斜槓會在模式中產生一個反斜槓,但是在同一個字符類中有兩次反斜槓,用'b'替換反斜槓,這就像編寫'[^ ... <>:b \「/ b \\ | ...]'。 –

回答

1

我知道這個帖子真的很老,但有人可能會從答案中受益。

問題是正則表達式字符串\u0000中的null,編譯器會將其解釋爲字符串的末尾。

正則表達式字符串應聲明爲原始,例如R"(some regex string)"。 這將解決您的正則表達式中的任何null問題。