在PCRE中,这将是一个有效的表达式
/^\!(foo|bar) ((?i)ab|cd|ef|gh)$/
但在JavaScript Regex中,这是无效的。不幸的是,我不知道(?i)
被称为什么,所以我在google它时遇到了一些麻烦。如何将此给定示例翻译为在JavaScript中有效?
我真正想做的事情:
查找所有以!foo
或!bar
开头,后跟空格并以ab
,cd
,ef
或gh
结尾的行。后者应该不区分大小写。
!foo CD
!foo cD
!foo cd
都是有效的。而
!FOO cd !Foo cd
无效
答案 0 :(得分:6)
(?i)
是case-insensitive flag
:从正则表达式中的位置开始,它放置所有character class
包含的字母,例如[a-z]
也匹配[A-Z]
(反之亦然)。这也适用于单个字母a
(匹配a
和A
)或序列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"。