2017-08-05 131 views
1

我試圖想出一個模式,以找到每個文本之間的雙引號或單引號在java源代碼。這是我有:正則表達式字符串與反斜槓逃脫

"(.*?)"|’(.*?)’ 

Debuggex Demo

這適用於幾乎所有的情況下,我想,除了一個:

"text\"moretext\"evenmore" 

Debuggex Demo

這可以作爲一個有效的字符串定義,因爲報價是逃脫的。模式不能識別更多文本的內部部分。

任何有關這種情況的模式的想法?

回答

5

您可以使用此正則表達式匹配的單或雙引號字符串忽略所有轉義引號:

(["'])([^\\]*?(?:\\.[^\\]*?)*)\1 

RegEx Demo

正則表達式破碎:

  • (["']):配單​​或雙引用並將其捕獲在組#1中
  • (:開始捕獲組#2
    • [^\\]*?:匹配0或更大的任何字符不是\
    • (?:`:啓動非捕獲組
      • \\:匹配一個\
      • .:後跟被轉義
      • [^\\]*?任何字符:由0個或多個的任何非,接着個字符
    • )*:結束非捕獲組。匹配0或多個該非捕獲組
  • ):結束捕獲組#2
  • \1:匹配閉單或雙引號中組#匹配1
+1

十分感謝這似乎是工作,我發現一個其他的解決辦法太:Debuggex演示](https://www.debuggex.com/r/sCEy0odJYlvw_M4R)這看起來更容易,也可以工作,wouldnt它? – cyden

+0

這並不簡單,因爲它不匹配單引號字符串。 – anubhava

+0

[Debuggex Demo](https://www.debuggex.com/r/IyVuenyKzBCaKgFU )。現在這個單引號,這個shoudl工作我猜。它不會識別「test \」,因爲最後的反斜槓,但這也不是一個vaild字符串在java中定義,所以這種情況永遠不會發生。或者我錯了嗎? – cyden

2

應工作:"([^"\\]|\\.)*"|'([^'\\]|\\.)*'Regexr test

說明:

  1. "匹配「。
  2. [^"\\]|\\.否定的\ &匹配 」(即,使得它消耗\「)或繼續的\和任何字符匹配。
  3. *繼續比賽。 。
  4. "比賽

同爲'

+1

它也可能與'「abc''匹配,並且不能正確匹配:''textmo」re「textevenmore'' – anubhava

+1

@anubhava編輯。 – BladeMight

+0

這個工作得很好,謝謝! – cyden

相關問題