首先說這個正則表示式的意圖它匹配的字串,是以雙引號開始,後面跟隨的字元是跳脫字元、或除了未轉義的雙引號、以及單個的 \ 之外的所有字元,最後以雙引號結束var my_regexp = /"(?:\\.|[^\\\"])*/g;這行有錯,不知道是你漏寫了還是印刷問題應該是var my_regexp = /"(?:\\.|[^\\\"])*"/g;和它下面的 new RegExp 對比一下就知道,上面的表示式漏掉了最後的一個雙引號\\. 代表的是跳脫字元,例如 \r \n等,還包括 \"[^\\\"] 代表的是除了 \ 與 " 外的所有字元。\ 後面如果帶有一個非換行字元,會進入上一個分支;如果後面未帶字元或者帶著換行符,就會使匹配失敗。單獨未轉義的雙引號會使匹配終止(成功終止)。舉幾個例子:它能匹配 a"hello"b 中的 "hello"匹配 a"he\"llo"b 中的 "he\"llo"匹配 a"he\\\nllo"b 中的 "he\\\nllo"注意:我上面寫的例子,都是指字串的實際值,如果是字串字面量,是需要多加一重轉義的例如 a"he\"llo" 應該寫成 var s = "a"he\\"llo""var s = "a"he\"llo"" 的值實際上是 a"he"llo"用 console.log 列印一下兩個字串,可以看出它們的區別這裡其實可以回答題目中的一個問題:為什麼這麼多 \ ?js的正則表示式物件有兩種構造方式,一種是直接寫正則表示式字面量,另一種是用 new RegExp 配合字串進行構造題目中的第二種方式就是使用了字串在正則表示式中,一個 \ 需要用2個 \ 來表示,即 \\但是在字串的字面量中,\\ 代表 \因此用正則表示式匹配單個的 \ ,使用字串方式構造,就需要寫成 \\\\,即4個 \另外需要注意, \\. 匹配的並不是特殊字元本身,而是特殊字元的轉義寫法例如:var s = "aa\\nbb";s的值實際上是 aa\nbb,用 \\. 可以匹配這裡的 \n若 var s = "aa\nbb";那麼s的值會是aabb這中間有一個實際的換行符,\\. 不能匹配這個換行符,它是由 [^\\\"] 來匹配的這個正則表示式看起來是用來捕獲雙引號之間的內容。另外有個答案說它不能匹配雙引號,我覺得不是,它能匹配轉義的雙引號(值為 \",字面量寫作 \\\")。但是這個正則表示式確實有點問題:1、雙引號包起來的內容中,它匹配了換行符。絕大多數應用場景下,雙引號中的內容都是不允許有換行符存在的,少數情況允許,例如php語言的字串等等。這點不能說是絕對錯的,還是要看應用場景。2、沒有考慮開始的雙引號前面的字元例如 a\"aa"hello"如果是出於獲取雙引號之間內容的目的,正確匹配結果應該只有 "hello"但是按照這個表示式,它會錯誤匹配到 "aa" 這裡的錯誤在於:aa之前的雙引號是一個轉義的雙引號如果正則表示式寫的正確,要麼是匹配 "hello",要麼是報告第一個 \"aa 語法錯誤,還是要看具體的應用場景,即使用這個正則表示式來分析的目標字串是什麼型別的——是純文字,還是某種語言的原始碼,或者是某種格式的資料,等等。
首先說這個正則表示式的意圖它匹配的字串,是以雙引號開始,後面跟隨的字元是跳脫字元、或除了未轉義的雙引號、以及單個的 \ 之外的所有字元,最後以雙引號結束var my_regexp = /"(?:\\.|[^\\\"])*/g;這行有錯,不知道是你漏寫了還是印刷問題應該是var my_regexp = /"(?:\\.|[^\\\"])*"/g;和它下面的 new RegExp 對比一下就知道,上面的表示式漏掉了最後的一個雙引號\\. 代表的是跳脫字元,例如 \r \n等,還包括 \"[^\\\"] 代表的是除了 \ 與 " 外的所有字元。\ 後面如果帶有一個非換行字元,會進入上一個分支;如果後面未帶字元或者帶著換行符,就會使匹配失敗。單獨未轉義的雙引號會使匹配終止(成功終止)。舉幾個例子:它能匹配 a"hello"b 中的 "hello"匹配 a"he\"llo"b 中的 "he\"llo"匹配 a"he\\\nllo"b 中的 "he\\\nllo"注意:我上面寫的例子,都是指字串的實際值,如果是字串字面量,是需要多加一重轉義的例如 a"he\"llo" 應該寫成 var s = "a"he\\"llo""var s = "a"he\"llo"" 的值實際上是 a"he"llo"用 console.log 列印一下兩個字串,可以看出它們的區別這裡其實可以回答題目中的一個問題:為什麼這麼多 \ ?js的正則表示式物件有兩種構造方式,一種是直接寫正則表示式字面量,另一種是用 new RegExp 配合字串進行構造題目中的第二種方式就是使用了字串在正則表示式中,一個 \ 需要用2個 \ 來表示,即 \\但是在字串的字面量中,\\ 代表 \因此用正則表示式匹配單個的 \ ,使用字串方式構造,就需要寫成 \\\\,即4個 \另外需要注意, \\. 匹配的並不是特殊字元本身,而是特殊字元的轉義寫法例如:var s = "aa\\nbb";s的值實際上是 aa\nbb,用 \\. 可以匹配這裡的 \n若 var s = "aa\nbb";那麼s的值會是aabb這中間有一個實際的換行符,\\. 不能匹配這個換行符,它是由 [^\\\"] 來匹配的這個正則表示式看起來是用來捕獲雙引號之間的內容。另外有個答案說它不能匹配雙引號,我覺得不是,它能匹配轉義的雙引號(值為 \",字面量寫作 \\\")。但是這個正則表示式確實有點問題:1、雙引號包起來的內容中,它匹配了換行符。絕大多數應用場景下,雙引號中的內容都是不允許有換行符存在的,少數情況允許,例如php語言的字串等等。這點不能說是絕對錯的,還是要看應用場景。2、沒有考慮開始的雙引號前面的字元例如 a\"aa"hello"如果是出於獲取雙引號之間內容的目的,正確匹配結果應該只有 "hello"但是按照這個表示式,它會錯誤匹配到 "aa" 這裡的錯誤在於:aa之前的雙引號是一個轉義的雙引號如果正則表示式寫的正確,要麼是匹配 "hello",要麼是報告第一個 \"aa 語法錯誤,還是要看具體的應用場景,即使用這個正則表示式來分析的目標字串是什麼型別的——是純文字,還是某種語言的原始碼,或者是某種格式的資料,等等。