JavaScript Regex忽略特定捕获组的大小写

zf9nrax1  于 2023-08-08  发布在  Java
关注(0)|答案(2)|浏览(87)

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

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

字符串
但在JavaScript Regex中,这是无效的。不幸的是,我不知道(?i)叫什么,所以我在谷歌上搜索它时遇到了一些麻烦。我如何将这个给定的例子转换为在JavaScript中有效?
我真正想做的是:
查找以!foo!bar开头,后跟空格,以abcdefgh结尾的所有行。后者应该不区分大小写。

!foo CD
!foo cD
!foo cd


都是有效的期间
!FOO cd!Foo cd
将是无效的

jobtbby3

jobtbby31#

(?i)case-insensitive flag:从正则表达式中的位置开始,它会使所有包含字母e.g.的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  
不匹配-> 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])$/

yqhsw0fo

yqhsw0fo2#

您可以从这里下载ECMAScript(JavaScript)文档:
https://www.ecma-international.org/publications/standards/Ecma-262.htm
RegExp在那里有明确的定义,它不是基于高级Perl规则。因此不支持(?...)语法(请参阅下面的更新,它适用于较新的浏览器)。
一种方法是对每个需要大写/小写的字符使用[...]

(?i)ab

字符串
成为

[aA][bB]


这是一个更多的打字,但我不知道一个更好的解决方案。
如果整个正则表达式在任何情况下都可以是,那么你可以使用标志:

/ab/i


但是在你的例子中,这意味着“foo”也可以被接受为“Foo”或“fOO”。

更新

新版本的JavaScript支持(<flag>?...)语法。

  • 如果RegExp对象的OriginalFlags内部槽包含“s”,则DotAll为true,否则为false。
  • 如果RegExp对象的OriginalFlags内部槽包含“i”,则IgnoreCase为true,否则为false。
  • 如果RegExp对象的OriginalFlags内部槽包含“m”,则Multiline为true,否则为false。
  • 如果RegExp对象的OriginalFlags内部槽包含“u”,则Unicode为true,否则为false。

因此,Giuseppe Ricupero的答案适用于新的浏览器,Node,React等。

相关问题