Lan*_*ard 404 javascript regex
我只想用任何可能的字符串创建一个正则表达式.
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
Run Code Online (Sandbox Code Playgroud)
有内置的方法吗?如果没有,人们会用什么?Ruby有RegExp.escape.我觉得我不需要自己编写,那里必须有标准的东西.谢谢!
bob*_*nce 528
上面链接的功能不足.它无法转义^或$(字符串的开头和结尾),或者-在字符组中用于范围.
使用此功能:
RegExp.escape= function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
Run Code Online (Sandbox Code Playgroud)
虽然乍一看似乎没必要,但转义-(以及^)使该函数适合于转义字符插入到字符类以及正则表达式的主体中.
Escaping /使该函数适合转义在JS regex文字中用于以后eval的字符.
因为逃避它们中的任何一个都没有任何缺点,所以逃避覆盖更广泛的用例是有意义的.
是的,令人失望的是,这不是标准JavaScript的一部分.
gus*_*nke 100
对于使用lodash的任何人,从v3.0.0开始,内置了一个_.escapeRegExp函数:
_.escapeRegExp('[lodash](https://lodash.com/)');
// ? '\[lodash\]\(https:\/\/lodash\.com\/\)'
Run Code Online (Sandbox Code Playgroud)
而且,如果您不想要完整的lodash库,您可能只需要该功能!
Pi *_*ion 37
这里的大多数表达式解决了单个特定用例.
没关系,但我更喜欢"永远有效"的方法.
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Run Code Online (Sandbox Code Playgroud)
这将为正则表达式中的任何以下用法"完全转义"文字字符串:
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, '\\$&');
}
Run Code Online (Sandbox Code Playgroud)
此函数会转义除了明确保证在将来的正则表达式风格中不用于语法的那些字符.
对于真正的卫生敏锐,请考虑这种边缘情况:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Run Code Online (Sandbox Code Playgroud)
这应该在JavaScript中编译良好,但不会在其他一些风格.如果打算传递给另一种味道,s === ''应该独立检查null的情况,如下所示:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
Run Code Online (Sandbox Code Playgroud)
qui*_*int 24
Mozilla开发者网络的正则表达式指南提供了这种转义功能:
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
Run Code Online (Sandbox Code Playgroud)
Pie*_* SS 21
在jQueryUI的自动完成小部件(版本1.9.1)中,他们使用略有不同的正则表达式(第6753行),这里是正则表达式与@bobince方法相结合.
RegExp.escape = function( value ) {
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}
Run Code Online (Sandbox Code Playgroud)
dal*_*ege 12
什么都不能阻止你逃避每个非字母数字字符:
usersString.replace(/(?=\W)/g, '\\');
Run Code Online (Sandbox Code Playgroud)
在做的时候你会失去一定程度的可读性,re.toString()但你会赢得很多简单(和安全性).
根据ECMA-262,在一方面,正则表达式"的语法的字符"总是非字母数字,使得结果是安全的,和特殊的转义序列(\d,\w,\n)总是字母数字,使得没有假控制逃逸会产生.
Dre*_*ope 12
https://github.com/benjamingr/RexExp.escape/上有一个关于 RegExp.escape 的 ES7 提案, https://github.com/ljharb/regexp.escape上提供了一个 polyfill 。
\n基于被拒绝的 ES 提案的示例包括检查该属性是否已存在,以防 TC39 收回其决定。
\n代码:
\nif (!Object.prototype.hasOwnProperty.call(RegExp, \'escape\')) {\n RegExp.escape = function(string) {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n // https://github.com/benjamingr/RegExp.escape/issues/37\n return string.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, \'\\\\$&\'); // $& means the whole matched string\n };\n}\nRun Code Online (Sandbox Code Playgroud)\n代码缩小:
\nObject.prototype.hasOwnProperty.call(RegExp,"escape")||(RegExp.escape=function(e){return e.replace(/[.*+\\-?^${}()|[\\]\\\\]/g,"\\\\$&")});\nRun Code Online (Sandbox Code Playgroud)\n// ...\nvar assert = require(\'assert\');\n \nvar str = \'hello. how are you?\';\nvar regex = new RegExp(RegExp.escape(str), \'g\');\nassert.equal(String(regex), \'/hello\\. how are you\\?/g\');\nRun Code Online (Sandbox Code Playgroud)\n还有一个npm模块位于:\n https://www.npmjs.com/package/regexp.escape
人们可以安装它并按如下方式使用它:
\nnpm install regexp.escape\nRun Code Online (Sandbox Code Playgroud)\n或者
\nyarn add regexp.escape\nRun Code Online (Sandbox Code Playgroud)\nvar escape = require(\'regexp.escape\');\nvar assert = require(\'assert\');\n \nvar str = \'hello. how are you?\';\nvar regex = new RegExp(escape(str), \'g\');\nassert.equal(String(regex), \'/hello\\. how are you\\?/g\');\nRun Code Online (Sandbox Code Playgroud)\n在 GitHub && NPM 页面中也描述了如何为此选项使用 shim/polyfill。该逻辑基于return RegExp.escape || implementation;,其中实现包含上面使用的正则表达式。
NPM 模块是一个额外的依赖项,但它也使外部贡献者更容易识别添加到代码中的逻辑部分。\xc2\xaf\\ (\xe3\x83\x84) /\xc2\xaf
\n小智 11
有一个ES7提案RegExp.escape在https://github.com/benjamingr/RexExp.escape/,与可用填充工具https://github.com/ljharb/regexp.escape.
另一种(更安全)的方法是使用 unicode 转义格式转义所有字符(而不仅仅是我们目前知道的一些特殊字符)\u{code}:
function escapeRegExp(text) {
return Array.from(text)
.map(char => `\\u{${char.charCodeAt(0).toString(16)}}`)
.join('');
}
console.log(escapeRegExp('a.b')); // '\u{61}\u{2e}\u{62}'
Run Code Online (Sandbox Code Playgroud)
请注意,您需要传递u标志才能使此方法起作用:
var expression = new RegExp(escapeRegExp(usersString), 'u');
Run Code Online (Sandbox Code Playgroud)
这是一个较短的版本。
RegExp.escape = function(s) {
return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}
Run Code Online (Sandbox Code Playgroud)
这包括非元字符%,&,',和,,但JavaScript的正则表达式规范允许这样做。
| 归档时间: |
|
| 查看次数: |
104442 次 |
| 最近记录: |