2014-04-01 83 views
2

我想知道的是如何修改下面的正則表達式:\".*?\"所以它會忽略轉義「字符(\"),所以它不會結束在\"匹配正則表達式匹配引用字符串而忽視逃脫引號

對於例如:

parameter1 = "  fsfsdfsd \"  " parameter2 = " fsfsfs " 

我想匹配:

" fsfsdfsd \" "

" fsfsfs "

但不

" fsfsdfsd \" " parameter2 = " fsfsfs "

等等

+0

所以,你的意思是捕獲兩個引號之間的一切? –

+0

是的,但是很懶,所以它會匹配引號中最短的字符串。 – mrpyo

+0

給我們一個字符串的例子,你期望從中得到什麼 – Colandus

回答

6

試試這個:

"(?:\\"|[^"])*" 

儘管(你可以避免使用lookbehind),但它與"test \"相匹配。如果你需要使用\

Online Demo

+0

+1 - 仍試圖理解它,但真的很好! –

+0

非常感謝你,親切的主席先生。 –

0

您需要負回顧後您的正則表達式:

(?<!\\\\)\".*?(?<!\\\\)\" 
2

我通常處理這類任務搞清楚什麼是元素可引號之間出現轉義字符。在這種情況下,每個元件可以是:

  1. 不是\"任何字符;
  2. 雙字符序列\";
  3. a \之後不是"

如果需要的話,允許\\代表\,例如,或允許其他逃逸您還可以擴大這一點;修改上面的列表應該非常簡單。

然後正則表達式只是跟在列表中的規則:注:這是一個正則表達式,而不是一個Java字符串字面

"(([^\\"]|\\"|\\(?!"))*)" 

這意味着,在引號內,我們匹配一個或更多的:(1)除\"(角色等級)以外的字符; (2)序列\"; (3)\之後不是"(負向預測)。當然,Java字符串文字看起來非常難看:

"\"(([^\\\\\"]|\\\\\"|\\\\(?!\"))*)\"" 

(注意:未經測試。)

0

行情之間的字符串匹配正確的正則表達式爲:

 

    "([^\\"]+|\\.|\\\\)*" 

但在Java斜線besause需要進行轉義,結果表達式爲:

 

    Pattern.compile("\"(?:[^\\\\\"]+|\\\\.|\\\\\\\\)*\""); 

這個表達式匹配slash-例如:

 

    ... "123 \\\" 456 \\" ... 
      ^ ^slash literal 
      ^
      ^slash literal + escaped quote 

正則表達式p寫在上面的評論將失敗在這個例子

相關問題