Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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,在PCRE中,这将是一个有效的表达式 /^\!(foo|bar) ((?i)ab|cd|ef|gh)$/ 但在JavaScript正则表达式中,这是无效的。不幸的是,我不知道什么叫(?I),所以我在谷歌搜索时遇到了一些麻烦。我如何将这个给定的示例转换为JavaScript中的有效示例 我真正想做的是: 查找所有以开头的行!foo或!条码后跟空格,以ab、cd、ef或gh结尾。后者应不区分大小写 !foo CD !foo cD !foo cd 都是有效的。当 !!富cd !富cd 将无效您可

在PCRE中,这将是一个有效的表达式

/^\!(foo|bar) ((?i)ab|cd|ef|gh)$/
但在JavaScript正则表达式中,这是无效的。不幸的是,我不知道什么叫
(?I)
,所以我在谷歌搜索时遇到了一些麻烦。我如何将这个给定的示例转换为JavaScript中的有效示例


我真正想做的是:

查找所有以
开头的行!foo
!条码
后跟空格,以
ab
cd
ef
gh
结尾。后者应不区分大小写

!foo CD
!foo cD
!foo cd
都是有效的。当

!!富cd !富cd


将无效

您可以从以下位置下载ECMAScript(JavaScript)文档:

这里明确定义了RegExp,它不基于高级Perl规则。因此不支持(?…)语法

一种方法是对每个需要大写/小写的字符使用
[…]

(?i)ab   becomes   [aA][bB]
打字要多得多,但我不知道有更好的解决办法

如果在任何情况下都可以使用整个正则表达式,则可以使用以下标志:

/ab/i
但在您的示例中,这意味着“foo”也将被接受为“foo”或“foo”


较新版本的JavaScript确实支持
(?…)
语法

  • 如果RegExp对象的[[OriginalFlags]]内部插槽包含“s”,则DotAll为true,否则为false
  • 如果RegExp对象的[[OriginalFlags]]内部插槽包含“i”,则IgnoreCase为true,否则为false
  • 如果RegExp对象的[[OriginalFlags]]内部插槽包含“m”,则Multiline为true,否则为false
  • 如果RegExp对象的[[OriginalFlags]]内部插槽包含“u”,则Unicode为true,否则为false
因此,朱塞佩·里库佩罗的答案适用于新浏览器、节点、React等。
(?i)
是:从正则表达式中放置字符的位置开始,它使所有包含字母的
字符类
也匹配
[a-z]
(反之亦然)。这也适用于单个字母
a
(匹配
a
a
)或序列
ab
(匹配
ab,ab,ab

因此,您可以将它放在regex
/(?i)regex/
(使其等效于js
/regex/i
)的开头,也可以将它与它的对立面
(?-i)
一起使用,使regex的某些部分不区分大小写:

/^(?i)[a-z]{2}(?-i)[a-z]{2}/ 
上面的正则表达式匹配2个大写或小写字符加上2个严格的小写字符

匹配->  岩石,岩石,岩石
不匹配->岩石,岩石,岩石

你的PCRE正则表达式呢

/^\!(foo|bar) ((?i)ab|cd|ef|gh)$/
如果您不介意也匹配以
开头的字符串!福,!福,!福,!福,!酒吧!,!条形图,…
您可以将标志放在外部,如下所示:

/^!(foo|bar) (ab|cd|ef|gh)$/i # you can also remove the escape from \! -> !
如果您想要与原始PCRE正则表达式完全等效(
/^!(foo | bar)((?i)ab | cd | ef | gh)$/
),则等效的js正则表达式可读性较差:

/^!(foo|bar) ([Aa][Bb]|[Cc][Dd]|[Ee][Ff]|[Gg][Hh])$/

我尝试将示例代码放入节点中,但它返回的语法错误:无效正则表达式:/^(?I)[a-z]{2}(?-I)[a-z]{2}/:无效group@zudduz谢谢你让我澄清一个模棱两可的问题。您报告的正则表达式是正则表达式。在我的回答中引用它只是因为OP特别要求解释
(?i)
PCRE运算符。javascript的等价物是
/^[a-zA-Z]{2}[a-Z]{2}/