Javascript中有RegExp.escape函数吗?

我只是想从任何可能的字符串中创建一个正则表达式。

var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);

有没有内置的方法呢? 如果不是,人们使用什么? Ruby有RegExp.escape 。 我不觉得自己需要写自己的东西,那里必须有标准。 谢谢!


上面链接的功能不足。 它无法转义^$ (字符串的开始和结尾)或- ,在字符组中用于范围。

使用此功能:

RegExp.escape= function(s) {
    return s.replace(/[-/^$*+?.()|[]{}]/g, '$&');
};

虽然它可能似乎乍一看不必要,逸出-以及^ ),使合适的转义字符的功能被插入到字符类以及正则表达式的主体。

转义/使该函数适用于在以后的eval中用于JS正则表达式文字中的转义字符。

由于逃脱其中任何一个都没有缺点,所以逃避覆盖更广泛的用例是有意义的。

是的,这是一个令人失望的失败,这不是标准JavaScript的一部分。


对于任何使用lodash的人来说,自v3.0.0以来内置了一个_.escapeRegExp函数:

_.escapeRegExp('[lodash](https://lodash.com/)');
// → '[lodash](https://lodash.com/)'

而且,如果你不想要求完整的lodash库,你可能只需要这个功能!


这里的大多数表达式解决单个特定的用例。

没关系,但我更喜欢“总是有效”的方法。

function regExpEscape(literal_string) {
    return literal_string.replace(/[-[]{}()*+!<=:?./^$|#s,]/g, '$&');
}

这将为正则表达式中的以下任何用途“完全转义”文字字符串:

  • 插入正则表达式。 例如new RegExp(regExpEscape(str))
  • 插入字符类。 例如new RegExp('[' + regExpEscape(str) + ']')
  • 插入整数计数说明符。 例如, new RegExp('x{1,' + regExpEscape(str) + '}')
  • 在非JavaScript正则表达式引擎中执行。
  • 特殊字符涵盖:

  • - :在字符类中创建一个字符范围。
  • [ / ] :开始/结束一个角色类。
  • { / } :开始/结束一个数字说明符。
  • ( / ) :开始/结束一个组。
  • * / + / ? :指定重复类型。
  • . :匹配任何字符。
  • :转义字符,并启动实体。
  • ^ :指定匹配区域的开始,并且否定字符类中的匹配。
  • $ :指定匹配区域的结束。
  • | :指定替代。
  • # :以自由间隔模式指定注释。
  • s :以自由间距模式忽略。
  • , :分隔数字说明符中的值。
  • / :开始或结束表达。
  • :完成特殊的组类型和部分Perl风格的字符类。
  • ! :取消零宽度组。
  • < / = :零宽度组规格的一部分。
  • 笔记:

  • /在任何正则表达式中都不是严格必要的。 然而,它保护万一有人(不寒而栗)做eval("/" + pattern + "/");
  • ,确保如果字符串是数字说明符中的整数,它将正确地导致RegExp编译错误,而不是静默编译错误。
  • #s并不需要在JavaScript中逃脱,但在许多其他口味做的。 如果正则表达式稍后会传递给另一个程序,它们会在这里被转义。

  • 如果您还需要针对JavaScript正则表达式引擎功能的潜在附加功能进一步验证正则表达式,我建议您使用更偏执的方法:

    function regExpEscapeFuture(literal_string) {
        return literal_string.replace(/[^A-Za-z0-9_]/g, '$&');
    }
    

    除了那些明确保证不会用于未来正则表达式风格的语法之外,此函数会转义每个字符。


    对于真正想要卫生的人来说,考虑一下这个边缘案例:

    var s = '';
    new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
    

    这应该在JavaScript中编译好,但不会在其他一些版本中使用。 如果打算传递给另一种风格,应该单独检查s === ''的空例,如下所示:

    var s = '';
    new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
    
    链接地址: http://www.djcxy.com/p/74013.html

    上一篇: Is there a RegExp.escape function in Javascript?

    下一篇: IOS : containsObject Check for String