尋找帶引號的字串
建立一個正規表示式,用來尋找雙引號 "..."
中的字串。
這些字串應支援跳脫字元,就像 JavaScript 字串一樣。例如,引號可以用 \"
插入,換行符號可以用 \n
插入,而反斜線本身可以用 \\
插入。
let str = "Just like \"here\".";
請特別注意,跳脫的引號 \"
不會 結束字串。
因此,我們應該從一個引號搜尋到另一個引號,並在過程中忽略跳脫的引號。
這是任務的精華部分,否則它將會微不足道。
要比對的字串範例
.. "test me" ..
.. "Say \"Hello\"!" ... (escaped quotes inside)
.. "\\" .. (double backslash inside)
.. "\\ \"" .. (double backslash and an escaped quote inside)
在 JavaScript 中,我們需要將反斜線加倍才能將它們傳遞到字串中,像這樣
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
// the in-memory string
alert(str); // .. "test me" .. "Say \"Hello\"!" .. "\\ \"" ..
解決方案:/"(\\.|[^"\\])*"/g
。
逐步說明
- 首先,我們尋找開頭引號
"
- 然後,如果我們有反斜線
\\
(我們必須在模式中將它加倍,因為它是一個特殊字元),那麼任何字元在它之後都是沒問題的(一個點)。 - 否則,我們取用任何字元,除了引號(這表示字串的結尾)和反斜線(為了防止孤單的反斜線,反斜線只用在它之後的其他符號):
[^"\\]
- …以此類推,直到結尾引號。
實際運用
let regexp = /"(\\.|[^"\\])*"/g;
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
alert( str.match(regexp) ); // "test me","Say \"Hello\"!","\\ \""