【问题标题】:Pattern variable in RegExp doesn't work with specifiersRegExp 中的模式变量不适用于说明符
【发布时间】:2012-07-01 20:37:47
【问题描述】:

以下代码按预期写入“响应”:

var str = "Would you like to have responses";
var pattern = "Response";
document.write(str.match(new RegExp(pattern,'gi')));

但是当我添加像\b 这样的说明符时,下面会写“null”:

var str = "Would you like to have responses";
var pattern = "\bResponse";
document.write(str.match(new RegExp(pattern,'gi')));

我怎样才能让它工作?


有趣的是,以下两个都有效

document.write(str.match(new RegExp(/Response/gi)));
document.write(str.match(new RegExp(/\bResponse/gi)));

但我想使用new RegExp(pattern,modifiers); 语法。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    反斜杠在字符串中具有特殊含义,它是转义字符。当您想从字符串创建正则表达式时,必须转义反斜杠。

    如果转义字符具有相同的含义,您不会注意到它:

     '\n'.match('\n');
     '\n'.match('\\n');
    

    两者都有效。但是\b在字符串中没有这样的含义。
    new RegExp("\bResponse");变成/Response/\b是退格字符,不代表可见字符)。当转义没有特殊含义时,反斜杠会被删除。

    【讨论】:

    • 它实际上变成了/\u0008Response/ "\b" 是退格符U+0008
    • @Esailija 谢谢,我的最后一行缺少一些单词:p
    • 所以,简单地说,我必须像var pattern = "\\bResponse"; 一样逃避\b :)
    • @sevenkul 是的。但我建议使用 RegExp 文字,/\bResponse/gi 而不是构造函数,除非 regexp 是动态构造的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2014-05-04
    • 2015-05-16
    • 2018-03-13
    相关资源
    最近更新 更多