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