Reputation: 739
Is is possible escape parameterized regex when parameter contains multiple simbols that need to be escaped?
const _and = '&&', _or = '||';
let reString = `^(${_and}|${_or})`; //&{_or} needs to be escaped
const reToken = new RegExp(reString);
Working but not optimal:
_or = '\\|\\|';
Or:
let reString = `^(${_and}|\\|\\|)`;
It is preferred to reuse _or
variable and keep regex parameterized.
Upvotes: 3
Views: 4399
Reputation: 6396
You can make your own function which would escape your parameters, so that these works in final regexp. To save you time, I already found one written in this answer. With that function, you can write clean parameters without actually escaping everything by hand. Though I would avoid modifying build in classes (RegExp) and make a wrapper around it or something separate. In example below I use exact function I found in the other answer, which extends build in RegExp.
RegExp.escape = function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
const and = RegExp.escape('&&');
const or = RegExp.escape('||');
const andTestString = '1 && 2';
const orTestString = '1 || 2';
const regexp = `${and}|${or}`;
console.log(new RegExp(regexp).test(andTestString)); // true
console.log(new RegExp(regexp).test(orTestString)); // true
Upvotes: 2
Reputation: 8670
EDITED https://jsfiddle.net/ao4t0pzr/1/
You can use a Template Literal function to escape the characters within the string using a Regular Expression. You can then use that string to propagate a new RegEx filled with escaped characters:
function escape(s) {
return s[0].replace(/[-&\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
var or = escape`||`;
var and = escape`&&`;
console.log(new RegExp(`${and}|${or}`)); // "/\&\&|\|\|/"
Upvotes: 2