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) + '}') 特殊字符涵盖:
- :在字符类中创建一个字符范围。 [ / ] :开始/结束一个角色类。 { / } :开始/结束一个数字说明符。 ( / ) :开始/结束一个组。 * / + / ? :指定重复类型。 . :匹配任何字符。 :转义字符,并启动实体。 ^ :指定匹配区域的开始,并且否定字符类中的匹配。 $ :指定匹配区域的结束。 | :指定替代。 # :以自由间隔模式指定注释。 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
