您能只区分大小写的正则表达式吗?


100

我已经看到了很多使整个正则表达式不区分大小写的示例。我想知道的是让表达式的一部分不区分大小写。

例如,假设我有一个像这样的字符串:

fooFOOfOoFoOBARBARbarbarbAr

如果我想匹配所有出现的“ foo”(无论大小写),但我只想匹配大写的“ BAR”怎么办?

理想的解决方案是可以在正则表达式中使用的东西,但我也想听听特定于语言的东西(谢谢Espo

编辑

Espo提供的链接非常有帮助。那里有一个很好的例子,可以在表达式中打开和关闭修饰符。

对于我想做的示例,我可以执行以下操作:

(?i)foo*(?-i)|BAR

这使得匹配仅对匹配的foo部分不区分大小写。

除Javascript,Python和其他一些(如Espo所述)外,这似乎在大多数正则表达式实现中均有效。

我所想知道的大公司(Perl,PHP,.NET)都支持内联模式更改。


该问题已添加到堆栈溢出正则表达式常见问题解答中的 “修饰符”下。
aliteralmind 2014年

Answers:


88

Perl使您可以使用(?i :)模式修饰符使正则表达式的一部分不区分大小写。

现代的regex风格允许您仅将修饰符应用于正则表达式的一部分。如果在正则表达式的中间插入修饰符(?ism),则修饰符仅适用于修饰符右侧的正则表达式部分。您可以在模式前面加上减号来关闭它们。减号后的所有模式将关闭。例如(?i-sm)打开不区分大小写的功能,并同时关闭单行模式和多行模式。

并非所有的正则表达式都支持此功能。JavaScript和Python将所有模式修饰符应用于整个正则表达式。它们不支持(?-ismx)语法,因为当模式修饰符应用于整个正则表达式时,关闭选项毫无意义。默认情况下,所有选项都是关闭的。

您可以快速测试您使用的正则表达式味道如何处理模式修饰符。正则表达式(?i)te(?-i)st应该匹配test和TEst,但不能匹配teST或TEST。

资源


6

您使用什么语言?执行此操作的标准方法是// [[Ff] [Oo] {2} | BAR)/,并且区分大小写,但是例如在Java中,有区分大小写修饰符(?i)可以使所有右边的字符不区分大小写,并且(?-i)强制区分大小写。该Java regex修饰符的示例可以在此处找到。


+1为什么可以同时匹配两种情况而
又不

11
@NonaUrbiz:因为该表达式(?i)foobar[Ff][Oo]{2}[Bb][Aa][Rr]
Thanatos

1
而且因为它可以增长方式更加毛茸茸的和复杂的。
印章

6

不幸的是,不区分大小写的匹配的语法并不常见。在.NET中,您可以使用RegexOptions.IgnoreCase标志或?i修饰符


4

你可以用

(?:F|f)(?:O|o)(?:O|o)

.Net括号中的?:表示不捕捉,仅用于将|的术语分组。(或)声明。


26
“ [fF] [oO] [oO]”不是更好的选择吗?对于手头的示例,您甚至可以走到[[fF] [oO] \ {2}“ ;-)
Tomalak

4

的确可以依靠内联修饰符,如仅在部分正则表达式的“打开和关闭模式”中所述:

正则表达式(?i)te(?-i)st应与test相匹配TEst,但不能与teSTor相匹配TEST

但是,(?i:...)内联修饰符组是受支持的功能(请参阅修饰符跨度)。语法为(?i:,然后是要使cas不敏感的模式,然后是)

(?i:foo)|BAR

反之:如果您的模式是使用不区分大小写的选项编译的,并且您需要使正则表达式的一部分区分大小写,请-?:之后添加(?-i:...)

各种语言的示例用法(用尖括号包裹匹配项):

  • - preg_replace("~(?i:foo)|BAR~", '<$0>', "fooFOOfOoFoOBARBARbarbarbAr")演示
  • - re.sub(r'(?i:foo)|BAR', r'<\g<0>>', 'fooFOOfOoFoOBARBARbarbarbAr')demo)(注意Pythonre自Python 3.6开始支持内联修饰符组)
  • / / - Regex.Replace("fooFOOfOoFoOBARBARbarbarbAr", "(?i:foo)|BAR", "<$&>")演示
  • - "fooFOOfOoFoOBARBARbarbarbAr".replaceAll("(?i:foo)|BAR", "<$0>")演示
  • -- $s =~ s/(?i:foo)|BAR/<$&>/g演示
  • - "fooFOOfOoFoOBARBARbarbarbAr".gsub(/(?i:foo)|BAR/, '<\0>')演示
  • - gsub("((?i:foo)|BAR)", "<\\1>", "fooFOOfOoFoOBARBARbarbarbAr", perl=TRUE)示范
  • -- "fooFOOfOoFoOBARBARbarbarbAr".replacingOccurrences(of: "(?i:foo)|BAR", with: "<$0>", options: [.regularExpression])
  • -(使用RE2)- regexp.MustCompile(`(?i:foo)|BAR`).ReplaceAllString( "fooFOOfOoFoOBARBARbarbarbAr", `<${0}>`)演示

不支持 std::regex

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.