[英]Javascript Regex ignore case for specific capture group
在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
會無效的
(?i)
是case-insensitive flag
:從正則表達式中放置它的位置開始,它使包含字母的所有character class
例如[az]
也匹配[AZ]
(反之亦然)。 這也適用於單個字母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
不匹配 - > 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.