返回课程

查找带引号的字符串

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

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