2014-11-25 59 views
0

我實現一個詞法分析器用JavaScript正則表達式,令牌類型之一雙引號字符串,如‘ABC’。在複雜的情況是字符串轉義引號字符,如」一個\ 「b」。JavaScript的正則表達式匹配「A 」 B「

我認爲以下兩個正則表達式是等價的: 1)"(\\"|[^"])*" 2)"([^"]|\\")*"

但實際上只有1號作品。你可以在http://regex101.com/#javascript上試試2個正則表達式對「a \」b「,我不知道兩者之間有什麼區別,還有什麼更好的解決方法嗎?

PS:事實證明#1和#2是不同的,看下面的簡單示例:

regex = /(a|ab)*/ 
regex.exec("aab") -> matches "aa" 

JavaScript的正則表達式不會去嘗試,只要能夠匹配,它只是試圖找到一個可行的匹配

雖然下面的一個作品,因爲「AA 「不是匹配。」

regex = /^(a|ab)*$/ 
regex.exec("aab") -> matches "aab" 
+0

要是有一個工具,甚至比正則表達式_more_強大。我想,如果我是去創造這樣一個東西,我把它叫做一個解析器:-) – paxdiablo 2014-11-25 07:33:40

+0

我希望你能實現你的正則表達式基本上是()* – Etai 2014-11-25 07:47:22

+0

@Etai真的嗎?我不這麼認爲,第一個不匹配「」「,我剛剛在regex101上試了一下 – Dagang 2014-11-25 07:50:06

回答

-1

區別基本上是操作順​​序。 RE#1將首先嚐試匹配一個反斜槓,然後是一個報價,然後是任何不是報價的東西。 RE#2將首先嚐試匹配任何不是引號的內容,然後是反斜線後跟引號。你會被RE#2絆倒,因爲任何不是引用的內容都可以包含反斜槓。解決它的方法是尋找任何這不是報價反斜槓:

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