我想知道Javascript RegExp是否能够在正则表达式本身内打开和关闭不区分大小写。我知道你可以为整个正则表达式设置修饰符,但这不是我所说的。
例如,我的搜索字符串可能是:
teXT To seArcH TOP SECRET
。
我想找到不敏感的案例部分“要搜索的文本”,然后强制区分大小写“TOP SECRET”。
因此,这不匹配(因为最高机密的情况敏感性):
teXT To seArcH Top Secret
但这会匹配(第一节情况无关紧要):
text to search TOP SECRET
在Perl中,搜索字符串中的you can do this。 Javascript的正则表达式引擎是否支持这样的东西?
答案 0 :(得分:4)
您可以在区分大小写的“longhand”中编写RegExp
/[tT][eE][xX][tT] [tT][oO] [sS][eE][aA][rR][cC][hH] TOP SECRET/
.test('text to search TOP SECRET');
// true
另一种方法是两个正则表达式,一个不敏感的表达式,后面跟一个严格的表达式
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
此外,上面的函数test
可以在这种特定情况下进行优化(因为TOP SECRET
部分实际上是一个字符串文字,它总是具有完全相同的形式),它不需要一秒钟完整的 RegExp 测试来检查它,即你可以做到
(m || false) && 'TOP SECRET' === m[1];
答案 1 :(得分:3)
你能做的就是建立你的正则表达式:
var str = "teXT To seArch";
var r = new RegExp(
str.split('').map(function(c){return '['+c.toLowerCase()+c.toUpperCase()+']'}).join('')
+ ' TOP SECRET'
);
答案 2 :(得分:2)
不要这么认为。我建议这样做:
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.
}
答案 3 :(得分:2)
答案 4 :(得分:0)
为什么不简单地使用2个正则表达式?
var str = "teXT To seArcH TOP SECRET";
if (/text to search/i.test(str) && /TOP SECRET/.test(str)) {
console.log('match!');
}
我认为很难有一个很好的理由来制作一个非常复杂的正则表达式来覆盖每个案例,而当你可以制作一些与代码逻辑相结合的Regex时。从维护的角度来看,我更倾向于使用小口大小的正则表达式,因为弄清楚复杂的正则表达式实际上是多么令人生畏。