2012-05-15 87 views
1

我想編寫一個正則表達式,它可以匹配以下字符串文字說明。在過去的10個小時裏,我瘋狂地制定了各種正常表達式,而這些正則表達式看起來都不起作用。最後我歸結爲一個:正則表達式匹配具有轉義字符的字符串

  • ([^"]|(\\[.\n]))*\"

基本上,要求如下:

  1. 一個字符串文字必須相匹配,使得我在高達匹配的一切最後「,在之間可能有一個」,不應該結束字符串。
  2. 我們也可以能夠逃脫任何東西,包括一個\ n上帶有一個「\」
  3. 只有一個轉義「「」字符可以結束比賽,僅此而已。

一些樣品字符串這我需要正確匹配以下內容:

  1. \ a \ b \「\ n」=>我應該匹配以下字符'\','a','\','b','\', '''','\','n','''
  2. \「this is still inside the string」=> s '''
  3. ''即將跳到換行\'\ n'「=>該字符串中有一個\ n字符,但字符串仍然匹配從開始'm'到結尾 '」'。

請別人幫我制定這樣的正則表達式。在我看來,我所提供的正則表達式應該能夠完成這項工作,但是無緣無故的失敗。

+0

我不明白爲什麼沒有這個問題的固定配方。這是一個標準問題。在每一種編程語言中,我們都需要以某種方式匹配字符串文字,而且通常我們允許\ escape序列具有很大的自由度。應該有一些通用的配方(標準正則表達式)來達到這個效果。但是,我沒有找到任何。 – VaidAbhishek

回答

2

你的正則表達式是差不多吧,你只需要知道一個字符類中期內.只是一個文字.,而不是除換行符任何字符。所以:

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

或者:

([^"\\]|\\[\s\S])*\" 
+0

謝謝。這有很大幫助。 – VaidAbhishek

1

我認爲這將是更有效的:

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

我假設你的字符串也開始有「(如果您的實例無法啓動用它?)

環視結構似乎是最自然的,我用:

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

鑑於輸入

"test" test2 "test \a test" "test \"test" "test\"" 

將匹配:

"test" 
"test \a test" 
"test \"test" 
"test\"" 

正則表達式如下:

Match the character 「"」 literally «"» 
Match any single character that is not a line break character «.*?» 
    Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?» 
Match the character 「"」 literally «"» 
Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!\\")» 
    Match the character 「\」 literally «\\» 
    Match the character 「"」 literally «"» 
+0

你使用哪種語言的正則表達式? – buckley

+0

正則表達式經驗法則#37:如果它看起來很自然,你可能做錯了。 :D幾乎每個人都會在某個時間或其他地方提出這種方法,但如果最後一個引用之前的最後一個內容是一個轉義反斜槓 - 例如''test \\''',它就會失敗。 –

+0

我使用lex,我必須定義正則表達式的規則。問題是我想匹配一個字符串文字。一旦我匹配,我會進一步處理它。我已經匹配了首發「,在這之後我必須匹配剩餘的麻繩,這可能包括這個星球上的任何東西,除非是一個非轉義的雙引號。不知何故,我無法做到這一點。 – VaidAbhishek