回到课程

查找引用的字符串

构建一个正则表达式以查找双引号 "..." 中的字符串。

字符串应该支持转义,就像 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\"!","\\ \""