在PCRE中,这是一个有效的表达式
/^\!(foo|bar) ((?i)ab|cd|ef|gh)$/
字符串
但在JavaScript Regex中,这是无效的。不幸的是,我不知道(?i)
叫什么,所以我在谷歌上搜索它时遇到了一些麻烦。我如何将这个给定的例子转换为在JavaScript中有效?
我真正想做的是:
查找以!foo
或!bar
开头,后跟空格,以ab
、cd
、ef
或gh
结尾的所有行。后者应该不区分大小写。
!foo CD
!foo cD
!foo cd
型
都是有效的期间
!FOO cd!Foo cd
将是无效的
2条答案
按热度按时间jobtbby31#
(?i)
是case-insensitive flag
:从正则表达式中的位置开始,它会使所有包含字母e.g.的character class
都变成一个字符。[a-z]
也匹配[A-Z]
(反之亦然)。这也适用于单个字母a
(匹配a
和A
)或序列ab
(匹配ab,Ab,aB,AB
)。所以你可以把它放在你的正则表达式
/(?i)regex/
的开头(使它等价于js/regex/i
),或者你可以把它和它的对立面(?-i)
一起使用,使正则表达式case-insensitive
的一部分:字符串
上面的正则表达式匹配2个大写或小写字符加上2个严格小写字符。
火柴-> ROCK,rOck,Rock
不匹配-> ROCK,roCk,rOcK
你的PCRE正则表达式呢?
型
如果你不介意匹配一个以
!Foo,!FOo,!foO,!fOO,!BAR,!bar,...
开头的字符串,你可以把标志放在外面,如下所示:型
如果你想要的是与原来的PCRE正则表达式(
/^!(foo|bar) ((?i)ab|cd|ef|gh)$/
)完全等效的表达式,那么等效的js正则表达式就不那么可读了:型
yqhsw0fo2#
您可以从这里下载ECMAScript(JavaScript)文档:
https://www.ecma-international.org/publications/standards/Ecma-262.htm
RegExp
在那里有明确的定义,它不是基于高级Perl规则。因此不支持(?...)
语法(请参阅下面的更新,它适用于较新的浏览器)。一种方法是对每个需要大写/小写的字符使用
[...]
:字符串
成为
型
这是一个更多的打字,但我不知道一个更好的解决方案。
如果整个正则表达式在任何情况下都可以是,那么你可以使用标志:
型
但是在你的例子中,这意味着“foo”也可以被接受为“Foo”或“fOO”。
更新
新版本的JavaScript支持
(<flag>?...)
语法。因此,Giuseppe Ricupero的答案适用于新的浏览器,Node,React等。