2009-12-09 54 views
0

我想找到一個正則表達式(正則表達式),檢測您是否在C雙引號轉義字符串中有一些無效轉義(您可以在其中找到只有轉義的雙引號)。如何使用正則表達式檢測無效的C轉義字符串?

我認爲有效\\\n\r\"(測試字符串使用「)

的部分解決方案,這是使用(?<!\\)\\[^\"\\nr]但是這一次沒有檢測到類似\\\壞逃逸。

這裏是一個測試字符串,我用它來測試匹配:

...\n...\\b...\"...\\\\...\\\E...\...\\\...\\\\\..."...\E...

該表達式應該將最後6個塊作爲無效,前4個有效。問題是我目前的版本只能找到2/5錯誤。

+3

\\\ E是無效的 - 第一個斜槓逃脫第二個,第三個試圖逃脫E ... – 2009-12-09 12:58:29

+1

所以,你想測試一個*雙引號字符串*包含無效的轉義序列? – Gumbo 2009-12-09 13:43:58

+1

不要忘記,C編譯器實際上允許:簡單字符的'\ t \ b \ v \ f \ a \?\'';它們也允許'\ o \ oo \ ooo'用於八進制轉義,'\ xX \ xXX'用於十六進制(實際上名義上超過兩個十六進制數字)。而C99也允許'\ uXXXX'和'\ U00XXXXXX'爲十六進制編碼的Unicode字符。 – 2009-12-09 18:30:53

回答

3
(?:^|[^\\])(?:\\\\)*((?:\"|\\(?:[^\"\\nr]|$))) 

這是一個字符串的開始,或者不是反斜槓。然後,一些(可能爲零)正確地避開反斜槓,然後是非轉義的"或另一個反斜槓;如果它是另一個反斜槓,則它必須後跟一個既不是",\,n或者r,也不是字符串的結尾。

也會爲您捕獲不正確的轉義。

+0

+1試圖修復我的無效並刪除它 – Amarghosh 2009-12-09 14:06:49

+0

謝謝,Python字符串將是'r'(?:^ | [^ \\])(?:\「\\)*((?:\」| \\(?:[^ \「\\ nr] | $)))」'雙引號) – sorin 2009-12-09 14:25:03

+0

我的編輯並不需要我擺脫雙引號;顯然,當我逃避他們時,我錯過了那個。 – 2009-12-09 15:16:26

0

試試這個正則表達式:

^(?:[^\\]+|\\[\\rn"])*(\\(?:[^\\rn"]|$)) 

如果你有一個比賽,你有一個無效的轉義序列。

+0

這與'''不一致',這是Sorin所說的其中一個是無效的 – 2009-12-09 13:00:48

相關問題