Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式是否可以执行部分大小写不敏感?_Javascript_Regex - Fatal编程技术网

Javascript正则表达式是否可以执行部分大小写不敏感?

Javascript正则表达式是否可以执行部分大小写不敏感?,javascript,regex,Javascript,Regex,我想知道Javascript RegExp是否能够在正则表达式本身中打开和关闭大小写不敏感。我知道可以为整个正则表达式设置修饰符,但这不是我要说的 例如,我的搜索字符串可以是: 搜索绝密信息的文本 我想找到不区分大小写的部分“要搜索的文本”,然后强制区分大小写为“绝密” 因此,这不匹配(因为绝密的大小写敏感): 搜索绝密信息的文本 但这将匹配(第一节案例无关紧要): 搜索绝密信息的文本 在Perl中,在搜索字符串中。Javascript的正则表达式引擎支持这样的东西吗?为什么不简单地使用2个正则

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

例如,我的搜索字符串可以是:
搜索绝密信息的文本

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

因此,这不匹配(因为绝密的大小写敏感):
搜索绝密信息的文本

但这将匹配(第一节案例无关紧要):
搜索绝密信息的文本


在Perl中,在搜索字符串中。Javascript的正则表达式引擎支持这样的东西吗?

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

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

我认为很少有一个很好的理由来制作一个非常复杂的正则表达式来涵盖每一种情况,而你可以制作一些正则表达式,并结合代码逻辑。从维护的角度来看,我更愿意使用小规模的正则表达式,因为计算复杂正则表达式的实际功能可能会非常困难。

您可以使用区分大小写的“longhand”来编写正则表达式

另一种方法是两个正则表达式,一个是不敏感的,另一个是严格的

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
(因为
绝密
部分实际上是一个字符串文本,它将始终具有完全相同的形式),它不需要第二次完整的RegExp测试来检查它,也就是说,您可以这样做

(m || false) && 'TOP SECRET' === m[1];

您可以这样构建您的正则表达式:

var str = "teXT To seArch";
var r = new RegExp(
  str.split('').map(function(c){return '['+c.toLowerCase()+c.toUpperCase()+']'}).join('')
  + ' TOP SECRET'
);

别这么想。我建议这样做:

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.
}
根据,Javascript支持:

没有模式修饰符来设置常规模式中的匹配选项 表情


因此答案是否定的,您不能在正则表达式中打开或关闭大小写敏感度。

您可以使用不敏感的正则表达式搜索,然后进行一个小测试。或者通过编写一些代码来为您生成正则表达式。JavaScript没有像
(?i:…)
这样的作用域修饰符。你几乎必须自己做这件事,
/[tT][eE][xX][tT]TOP SECRET/
,或者把你的测试分成两部分:
var m=/text TOP SECRET$/i.match;m=m&&m[0]。匹配(/TOP_SECRET$/)
+1-通过编程方式为所需类型的测试创建RegExp最有帮助。文本的顺序不会保留,更不用说要搜索
/(?i:text to search)char/
,字符串是
text to searchar
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.
}