查找引用的字符串
构建一个正则表达式以查找双引号 "..."
中的字符串。
字符串应该支持转义,就像 JavaScript 字符串一样。例如,引号可以插入为 \"
,换行符可以插入为 \n
,而反斜线本身可以插入为 \\
。
let str = "Just like \"here\".";
请注意,转义的引号 \"
不会结束字符串匹配。
所以,我们应该匹配两个引号之间的内容,且忽略中间转义的引号。
这是任务的基本部分,否则这个任务就没什么意思了。
要匹配的字符串示例:
.. "test me" ..
.. "Say \"Hello\"!" ..(其中有被转义的引号)
.. "\\" ..(其中有双反斜线)
.. "\\ \"" ..(其中有双反斜线和被转义的引号)
在 JavaScript 中,双反斜线用于把反斜线转义为字符串,如下所示:
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
// 存储中的字符串
alert(str); // .. "test me" .. "Say \"Hello\"!" .. "\\ \"" ..
解决方案:/"(\\.|[^"\\])*"/g
。
一步一步来分析一下:
- 首先匹配左双引号
"
- 接着如果有反斜线
\\
,则匹配其后跟随的任意字符(.)。(技术上,我们必须在模式中用双反斜线,因为它是一个特殊的字符,但实际上是一个反斜线字符)。 - 如果没有,则匹配除双引号(表示字符串的末尾)和反斜线(排除仅存在反斜杠的情况,反斜杠仅在和其后字符一起使用时有效)外的任何字符:
[^"\\]
。 - ……继续匹配直到遇到右双引号
代码运行如下:
let regexp = /"(\\.|[^"\\])*"/g;
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
alert( str.match(regexp) ); // "test me","Say \"Hello\"!","\\ \""