Escape string for use in Javascript regex
Possible Duplicate:
Is there a RegExp.escape function in Javascript?
I am trying to build a javascript regex based on user input:
function FindString(input) { var reg = new RegExp('' + input + ''); // [snip] perform search }
But the regex will not work correctly when the user input contains a ?
or *
because they are interpreted as regex specials. In fact, if the user puts an unbalanced (
or [
in their string, the regex isn't even valid.
What is the javascript function to correctly escape all special characters for use in regex?
Short 'n Sweet
function escapeRegExp(str) {
return str.replace(/[-[]/{}()*+?.^$|]/g, "$&");
}
Example
escapeRegExp("All of these should be escaped: ^ $ * + ? . ( ) | { } [ ]");
>>> "All of these should be escaped: ^ $ * + ? . ( ) | { } [ ] "
Install
Available on npm as escape-string-regexp
npm install --save escape-string-regexp
Note
See MDN: Javascript Guide: Regular Expressions
Other symbols (~`!@# ...) MAY be escaped without consequence, but are not required to be.
.
.
.
.
Test Case: A typical url
escapeRegExp("/path/to/resource.html?search=query");
>>> "/path/to/resource.html?search=query"
The Long Answer
If you're going to use the function above at least link to this stack overflow post in your code's documentation so that it doesn't look like crazy hard-to-test voodoo.
var escapeRegExp;
(function () {
// Referring to the table here:
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp
// these characters should be escaped
// ^ $ * + ? . ( ) | { } [ ]
// These characters only have special meaning inside of brackets
// they do not need to be escaped, but they MAY be escaped
// without any adverse effects (to the best of my knowledge and casual testing)
// : ! , =
// my test "~!@#$%^&*(){}[]`/=?+|-_;:'",<.>".match(/[#]/g)
var specials = [
// order matters for these
"-"
, "["
, "]"
// order doesn't matter for any of these
, "/"
, "{"
, "}"
, "("
, ")"
, "*"
, "+"
, "?"
, "."
, ""
, "^"
, "$"
, "|"
]
// I choose to escape every character with ''
// even though only some strictly require it when inside of []
, regex = RegExp('[' + specials.join('') + ']', 'g')
;
escapeRegExp = function (str) {
return str.replace(regex, "$&");
};
// test escapeRegExp("/path/to/res?search=this.that")
}());
链接地址: http://www.djcxy.com/p/76814.html