2009-08-30 47 views
2
/^"((?:[^"]|\\.)*)"/ 

在此字符串:如何將帶引號的字符串與轉義引號匹配?

"quote\_with\\escaped\"characters" more 

它只匹配,直到\",雖然我已經明確規定\作爲轉義字符(和它匹配\_\\精...)。

+2

難道還有比「什麼是WRO更糟糕的問題與正則表達式?「 - 沒有罪CX。 – Rob 2009-08-30 00:14:21

+0

我知道,對不對:D 你有什麼標題? – 2009-08-30 00:20:07

+0

@Rob:這個問題的表述應該不同嗎?或者,有關正則表達式的問題不像預期的那樣不適合堆棧溢出? – 2009-08-30 00:20:55

回答

4

如果你翻車了你的兩個備選方案的順序是否能夠正常工作:

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

的問題是,否則,重要的\字符被吃掉它試圖匹配\"之前。它之前只適用於\\\_,因爲兩個字符都與您的[^"]匹配。

+0

簡單的錯誤與事物的順序,輝煌。謝謝! – 2009-08-30 00:41:07

0

使用Python與原始字符串字面量,以確保轉義序列沒有進一步解釋正在發生,下面的變型不工作:

import re 

x = re.compile(r'^"((?:[^"\\]|\\.)*)"') 

s = r'"quote\_with\\escaped\"characters" more"' 

mo = x.match(s) 
print mo.group() 

發出"quote\_with\\escaped\"characters";我相信在你的版本中(如果在這裏取代它,也會早早打斷這場比賽),「不是雙引號」的子表達式([^"])正在吞噬你打算被視爲逃避緊隨其後的角色的反斜槓。我在這裏所做的只是確保這樣的反斜槓不會被這種方式吞噬,正如我所說的那樣,它似乎適用於這種變化。

0

不打算混淆,只是我玩過的另一個信息。下面的正則表達式(PCRE)儘量不匹配錯誤的語法(例如,用\結束。 「),並可以同」或使用「

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

用PHP

<?php if (preg_match('/(\'|").*\\\\\1.*?[^\\\\]\1/', $subject)) return true; ?> 

使用爲:

"quote\_with\\escaped\"characters" "aaa" 
'just \'another\' quote "example\"' 
"Wrong syntax \" 
"No escapes, no match here" 

這僅匹配:

"quote\_with\\escaped\"characters" and 
'just \'another\' quote "example\"' 
相關問題