Javascript正则表达式忽略特定捕获组的大小写

时间:2016-01-04 02:24:22

标签: javascript regex

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

/^\!(foo|bar) ((?i)ab|cd|ef|gh)$/

但在JavaScript Regex中,这是无效的。不幸的是,我不知道(?i)被称为什么,所以我在google它时遇到了一些麻烦。如何将此给定示例翻译为在JavaScript中有效?

我真正想做的事情:

查找所有以!foo!bar开头,后跟空格并以abcdefgh结尾的行。后者应该不区分大小写。

!foo CD
!foo cD
!foo cd

都是有效的。而

!FOO cd    !Foo cd

无效

2 个答案:

答案 0 :(得分:6)

(?i)case-insensitive flag:从正则表达式中的位置开始,它放置所有character class包含的字母,例如[a-z]也匹配[A-Z](反之亦然)。这也适用于单个字母a(匹配aA)或序列ab(匹配ab,Ab,aB,AB)。

因此,您可以将其置于正则表达式/(?i)regex/的开头(使其等同于js /regex/i),或者您可以将其与其对应的(?-i)一起使用,正则表达式的一部分case-insensitive

/^(?i)[a-z]{2}(?-i)[a-z]{2}/ 

上面的正则表达式匹配2个大写或小写字符加上2个严格小写的字符。

  

匹配 - > ROck,rOck,Rock
Not Matches - > ROCK,roCk,rOcK

你的PCRE正则表达式怎么样?

/^\!(foo|bar) ((?i)ab|cd|ef|gh)$/

如果您不介意匹配以!Foo,!FOo,!foO,!fOO,!BAR,!bar,...开头的字符串,您可以将标记放在外面,如下所示:

/^!(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])$/

答案 1 :(得分:0)

您可以从此处下载ECMAScript(JavaScript)文档:

http://www.ecmascript.org/docs.php

RegExp在那里明确定义,并不基于高级Perl规则。所以不支持(?...)语法。

执行所需操作的一种方法是对每个需要大写/小写的字符使用[...]

(?i)ab   becomes   [aA][bB]

打字更多,但我不知道更好的解决方案。

如果整个正则表达式都可以,那么你可以使用标志:

/ab/i

但在你的例子中,这意味着" foo"也将被接受为" Foo"或者" fOO"。