簡體   English   中英

Javascript正則表達式忽略特定捕獲組的大小寫

[英]Javascript Regex ignore case for specific capture group

在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

會無效的

(?i)case-insensitive flag :從正則表達式中放置它的位置開始,它使包含字母的所有character class例如[az]也匹配[AZ] (反之亦然)。 這也適用於單個字母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,!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])$/

您可以從此處下載ECMAScript(JavaScript)文檔:

https://www.ecma-international.org/publications/standards/Ecma-262.htm

RegExp在那里明確定義,並不基於高級Perl規則。 所以不支持(?...)語法。

做你想做的事的一種方法是對每個需要大寫/小寫的字符使用[...]

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

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

如果整個正則表達式可以在任何情況下,那么你可以使用標志:

/ab/i

但在你的例子中,這意味着“foo”也會被接受為“Foo”或“fOO”。


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

  • 如果RegExp對象的[[OriginalFlags]]內部插槽包含“s”,則DotAll為true,否則為false。
  • 如果RegExp對象的[[OriginalFlags]]內部插槽包含“i”,則IgnoreCase為true,否則為false。
  • 如果RegExp對象的[[OriginalFlags]]內部插槽包含“m”,則多行為true,否則為false。
  • 如果RegExp對象的[[OriginalFlags]]內部插槽包含“u”,則Unicode為true,否則為false。

所以Giuseppe Ricupero的答案適用於新的瀏覽器,Node,React等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM