2017-08-01 62 views
1

要求是建立一個Java正則表達式來讓所有的字符不包括管和結腸時沒有逃逸什麼是正則表達式失敗時,字符串有管道和冒號字符沒有逃脫?

|------|-----------------| 
|Input | Expected output | 
|------|-----------------| 
|aaaaa |  pass  | 
|------|-----------------| 
|aaa: |  fail  | 
|------|-----------------| 
|aaa| |  fail  | 
|------|-----------------| 
|aaa: |  pass  | 
|------|-----------------| 
|:  |  fail  | 
|------|-----------------| 
|\: |  pass  | 
|------|-----------------| 
|\\: |  fail  | 
|------|-----------------| 
|\\\: |  pass  | 
|------|-----------------| 
|\\\\ |  pass  | 
|------|-----------------| 


Tried following just for colon use-case - "(?<!\\)(\\\\)*\:" 

如果行爲是

  • 正確失敗的前面「:」和結腸通過偶數開頭背面 斜線
  • 正確地傳遞結腸由奇數的前面反斜線

  • 錯誤地傳遞的 「AAA:AAA」

+2

爲什麼第四個('aaa:')通過,第二個(也是'aaa:')是否失敗? – Andreas

回答

2

您可以使用此原子團基於正則表達式:

^(?>[^:|\\]|\\.)+$ 

RegEx Demo

對於Java使用:

final String regex = "^(?>[^:|\\\\\]|\\\\.)+$"; 

正則表達式解體:

  • ^:啓動
  • (?>:啓動原子團
    • [^:|\\]:比賽是不是|:\
    • |任何字符:或
    • \\:匹配一個\
    • .:匹配下一個字符之後的\
  • )+:結束原子團。匹配這個組中的一個或多個直到結束。
  • $:結束

建議使用atomic group避免回溯,以提高正則表達式的性能。

+0

謝謝!如果前面有多個反斜槓,則除外。如果前面是2(偶數)反斜槓,測試應該失敗,而3(添加)反斜槓測試應該通過。 –

+0

是的,我的意思是看後面。我們期待保留[:|]的序列化字符串。如果是,則:|被使用,他們應該逃脫。 –

+0

太棒了。感謝您更新的正則表達式!我相信除了「\\\\」之外,所有情況都會通過。 –

相關問題