2011-10-17 66 views
1

我想寫一個匹配字符串的正則表達式。爲簡單起見,我只關心用雙引號(「)的時刻串用於匹配文字字符串的正則表達式

到目前爲止,我有這樣的:​​

這適用於大多數字符串,但是當有一個轉義雙引號,如失敗這樣的:

"a string \" with an escaped quote" 

在這種情況下,它僅匹配到逃脫報價

我已經試過幾件事情,讓一個逃脫的報價,但到目前爲止,我一直不成功,任何人都可以給我。一隻手?

+1

你嘗試過什麼樣的事情呢? – ewok

+0

'「\」([^ \「] | \\\」)* \「」' –

+0

請始終指定您打算使用的語言或工具。 [正則表達式的實現有所不同](http://www.regular-expressions.info/refflavors.html),一種語言的解決方案可能不適用於另一種語言。 –

回答

2

我已經成功地解決它自己:

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

非常簡單和優雅!!但等一下!!如果(想要在字符串中使用引號字符,而不是內部引用的文本塊?我看不出有一個IGNORING的方式,它會錯誤地「啓動」一個引用的文本塊......你可以使它們全都是雙引號('「」'),這將匹配作爲空引用並被丟棄(或者還原爲單引號...) - 這將需要額外的文檔:「use」用來表示一個引號字符而不是引號,但用「」「來表示引用字符r在引號之外「... –

0

您需要一個negative lookbehind。檢查這是否有效?

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

(?<!\\)"應該匹配"這不是其次\

+0

爲了避免引用,'\\'放在**引號之前,而不是之後。 –

+0

是啊..這就是爲什麼它被稱爲**後面的** .. – Kashyap

+0

「(?<!\\)」應該匹配「那不是**後跟**」 –

1

試試這個:

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*" 

如果你想多行轉義字符串可以用:

"[^"\\]*(?:\\.[^"\\]*)*" 
+0

POSIX(假設ERE)支持非 - 收集羣體(你的表達中的'(?:')? –

0

通常要接受逃脫任何東西。

" [^"\\]* (?: \\. [^"\\]*)* "會是最快的。

"[^"\\]*(?:\\.[^"\\]*)*"壓縮。

0

POSIX不支持AFAIK,如果沒有它,真的沒有辦法只用正則表達式來做到這一點。然而,根據POSIX模擬器我有(沒有訪問本地環境或庫),這可能會關閉,在某些情況下:

"[^\"]*"|"[^\]*\\|\\[^\"]*[\"] 

它將捕捉逃脫的報價後,之前的一部分且該部分...與此源字符串(忽略換行,一個想象這一切都在一個字符串):

I want to match "this text" and "This text, where there is an escaped 
slash (\\), and an \"escaped quote\" (\")", but I also want to handle\\ escaped 
back-slashes, as in "this text, with a \\ backslash: \\" -- with a little 
text behind it! 

它將捕捉這些羣體:

"this text"           -- simple, quoted string 
"This text, where there is an escaped slash (\  -- part 1 of quoted string 
\), and an \           -- part 2 
"escaped quote\          -- part 3 
" (\             -- part 4 
")"             -- part 5, and ends with a quote 
\\             -- not part of a quoted string 
"this text, with a \         -- part 1 of quoted string 
\ backslash: \          -- part 2 
\"             -- part 3, and ends with a quote 

進一步的分析,你可以將它們組合起來,酌情:

  • 如果組開始,以"結束,那麼它是對自己
  • 精細如果該組有012開始,並用\結束,那麼它需要是緊跟另一場比賽組
  • 立即接着又匹配組,要麼用引號字符本身結束,或者繼續遞歸,如果組立即不跟隨另一場比賽,它不是引用字符串的一部分

我認爲這就是您需要的所有分析 - 但一定要測試它!

讓我知道這個想法是否有用!

編輯: 附加說明:僅僅是明確的,對這個工作的所有報價的整個源字符串中必須轉義,如果他們不被用作分隔符,和反斜槓必須普遍地逃過以及