3

我想知道 Javascript RegExp 是否能够在正则表达式本身中打开和关闭不区分大小写。我知道您可以为整个正则表达式设置修饰符,但这不是我要说的。

例如,我的搜索字符串可能是:
teXT To seArcH TOP SECRET.

我想找到不敏感的大小写部分“要搜索的文本”,然后强制区分“绝密”的大小写。

因此,这不匹配(因为最高机密的大小写敏感):
teXT To seArcH Top Secret

但这会匹配(第一部分的情况无关紧要):
text to search TOP SECRET

在 Perl 中,您可以在搜索字符串中执行此操作。Javascript 的正则表达式引擎是否支持这样的东西?

4

5 回答 5

4

您可以用区分大小写的“速记”编写 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];
于 2013-05-24T19:12:37.153 回答
3

你可以做的是像这样构建你的正则表达式:

var str = "teXT To seArch";
var r = new RegExp(
  str.split('').map(function(c){return '['+c.toLowerCase()+c.toUpperCase()+']'}).join('')
  + ' TOP SECRET'
);
于 2013-05-24T19:13:26.590 回答
3

根据this reference page,Javascript支持:

没有模式修饰符来设置正则表达式中的匹配选项。

所以答案是否定的,您不能在正则表达式中打开或关闭区分大小写。

于 2013-05-24T19:25:14.910 回答
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.
}
于 2013-05-24T19:19:41.840 回答
0

为什么不简单地使用 2 个正则表达式?

var str = "teXT To seArcH TOP SECRET";
if (/text to search/i.test(str) && /TOP SECRET/.test(str)) {
  console.log('match!');
}

我认为很少有充分的理由制作一个非常复杂的正则表达式来涵盖每种情况,而您可以制作一些与代码逻辑相结合的正则表达式。从维护的角度来看,我宁愿使用小尺寸的正则表达式,因为要弄清楚一个复杂的正则表达式实际上做了什么可能会让人望而生畏。

于 2013-05-24T19:12:29.713 回答