I want to do a string search inside a string. Simply saying MySTR.search(Needle)
.
The problem occurs when this needle
string contains special regex characters like *,+ and so on. It fails with error invalid quantifier
.
I have browsed the web and found out that string can be escaped with \Q some string \E
.
However, this does not always produce the desired behavior. For example:
var sNeedle = '*Stars!*';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');
Result is -1. OK.
var sNeedle = '**Stars!**';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');
Result is "invalid quantifier". This happens because 2 or more special characters are 'touching' each other, because:
var sNeedle = '*Dont touch me*Stars!*Dont touch me*';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');
Will work OK.
I know I could make a function escapeAllBadChars(sInStr)
and just add double slashes before every possible special regex character, but I'm wondering if there is a simpler way to do it?
\Q...\E
doesn't work in JavaScript (at least, they don't escape anything...) as you can see:
var s = "*";
print(s.search(/\Q*\E/));
print(s.search(/\*/));
produces:
-1
0
as you can see on Ideone.
The following chars need to be escaped:
(
)
[
{
*
+
.
$
^
\
|
?
So, something like this would do:
function quote(regex) {
return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1');
}
No, ]
and }
don't need to be escaped: they have no special meaning, only their opening counter parts.
Note that when using a literal regex, /.../
, you also need to escape the /
char. However, /
is not a regex meta character: when using it in a RegExp
object, it doesn't need an escape.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With