我准备实现读取 cookies,便从 MDN 复制了一段正则表达式(?:(?:^|.*;\s*)<COOKIE NAME>\s*\=\s*([^;]*).*$)|^.*$。简单使用/<正则表达式>/测试没问题之后就继续写代码了。
但是运行时发现程序无法实现想要的效果,检查了半天代码,才发现是正则表达式的问题。可是明明之前测试的时候是没问题的啊,我百思不得其解。又调试了半天,发现运行不了的原因是我用了new RegExp("<正则表达式>\")而转意反斜杠。
最后改为new RegExp("(?:(?:^|.*;\\s*)<COOKIE NAME>\\s*\\=\\s*([^;]*).*$)|^.*$")成功运行。
这其中有个问题干扰了我好久:用meal1作为 cookie 名就可以用未转义的正则读取,但是其他就不行。知道原因的朋友可以评论告诉我。
meal1 能成功并不是它有什么魔力,而是因为它碰巧是第一个 Cookie!在 JavaScript 字符串里 \s 会被直接吞掉斜杠变成字母 s。meal1 在开头,完美避开了前面需要匹配“分号+空格”的条件,而后面 s* 匹配 0 个字母 s 也正好通过了,这就造就了这场“完美的巧合”。
建议下次遇到需要动态拼接正则的情况,可以直接用 ES6 的 String.raw 模板字符串。这样就不用痛苦地数反斜杠写双重转义啦,所见即所得。
Leon 06-28