I want to know if Javascript RegExp has the ability to turn on and off case insensitivity within the regular expression itself. I know you can set the modifier for the entir
What you can do is build your regex like this :
var str = "teXT To seArch";
var r = new RegExp(
str.split('').map(function(c){return '['+c.toLowerCase()+c.toUpperCase()+']'}).join('')
+ ' TOP SECRET'
);
According to this reference page, Javascript supports:
No mode modifiers to set matching options within the regular expression.
So the answer is no, you cannot turn case sensitivity on or off within the regular expression.
You can write the RegExp in case-sensitive "longhand"
/[tT][eE][xX][tT] [tT][oO] [sS][eE][aA][rR][cC][hH] TOP SECRET/
.test('text to search TOP SECRET');
// true
An alternative approach is two regular expressions, an insensitive one followed by a strict one
function test(str) {
var m = str.match(/text to search (TOP SECRET)/i);
return (m || false) && /TOP SECRET$/.test(m[1]);
}
test('text to search TOP SECRET'); // true
test('text to search ToP SECRET'); // false
Further, function test
above can be optimised in this specific case (as the TOP SECRET
part is effectively a string literal which will always have exactly the same form), it doesn't require a second full RegExp test to check it, i.e. you can do
(m || false) && 'TOP SECRET' === m[1];
Why not simply use 2 Regex's?
var str = "teXT To seArcH TOP SECRET";
if (/text to search/i.test(str) && /TOP SECRET/.test(str)) {
console.log('match!');
}
I think there is rarely a good reason to make a single very complex regex to cover every case, when you could instead make a handful of Regex's which you combine with code logic. I'd much rather have small bite size Regex's from a maintenance point of view, as figuring what a complex regex actually does can be quite daunting.
Don't think so. I'd suggest doing this:
var m;
var str = "teXT To seArcH TOP SECRET";
if ((m = str.match(/text to search (top secret)/i)) && m[1].match(/TOP SECRET/)) {
// matched.
}