你能不能只对正则表达式不区分大小写的一部分吗?

时间:2008-09-04 12:33:27

标签: regex

我已经看到很多关于使整个正则表达式不区分大小写的例子。我想知道的是只有部分表达式不区分大小写。

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

fooFOOfOoFoOBARBARbarbarbAr

如果我想匹配所有出现的“foo”,无论情况如何,但我只想匹配大写的“BAR”,该怎么办?

理想的解决方案是适用于正则表达式的解决方案,但我也有兴趣听取语言特定的解决方案(感谢Espo

修改

提供的Espo链接非常有用。有一个很好的例子可以在表达式中打开和关闭修改器。

对于我做作的例子,我可以这样做:

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

使匹配不区分大小写匹配的foo部分。

除了Javascript,Python和其他一些(如Espo提到的),它似乎适用于大多数正则表达式实现。

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

5 个答案:

答案 0 :(得分:82)

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

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

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

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

Source

答案 1 :(得分:6)

您使用的是哪种语言?执行此操作的标准方法类似于/([Ff] [Oo] {2} | BAR)/具有区分大小写,但在Java中,例如,有一个区分大小写修饰符(?i),它使所有它右边的字符不区分大小写和(?-i)强制敏感。可以找到该Java正则表达式修饰符的示例here

答案 2 :(得分:6)

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

答案 3 :(得分:4)

您可以使用

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

.Net中的括号表示它是非捕获的,只是用于对|的条款进行分组。 (或)陈述。

答案 4 :(得分:2)

确实可以依靠Turning Modes On and Off for Only Part of The Regular Expression中所述的内联修饰符:

  

正则表达式(?i)te(?-i)st应该与test和TEst相匹配,但不能与teSTTEST相匹配。

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

(?i:foo)|BAR

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

示例使用了多种语言(用尖括号包裹匹配项):

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

std::regex不支持。