我已经看到很多关于使整个正则表达式不区分大小写的例子。我想知道的是只有部分表达式不区分大小写。
例如,假设我有一个这样的字符串:
fooFOOfOoFoOBARBARbarbarbAr
如果我想匹配所有出现的“foo”,无论情况如何,但我只想匹配大写的“BAR”,该怎么办?
理想的解决方案是适用于正则表达式的解决方案,但我也有兴趣听取语言特定的解决方案(感谢Espo)
修改
提供的Espo链接非常有用。有一个很好的例子可以在表达式中打开和关闭修改器。
对于我做作的例子,我可以这样做:
(?i)foo*(?-i)|BAR
使匹配不区分大小写匹配的foo部分。
除了Javascript,Python和其他一些(如Espo提到的),它似乎适用于大多数正则表达式实现。
我想知道的大问题(Perl,PHP,.NET)都支持内联模式更改。
答案 0 :(得分:82)
Perl允许您使用(?i :)模式修饰符使正则表达式的一部分不区分大小写。
现代正则表达式风格允许您仅将修饰符应用于正则表达式的一部分。如果在正则表达式的中间插入修饰符(?ism),则修饰符仅适用于修饰符右侧的正则表达式部分。您可以通过在前面加上减号来关闭模式。减号后的所有模式都将关闭。例如。 (?i-sm)打开不区分大小写,并关闭单行模式和多行模式。
并非所有正则表达式都支持此功能。 JavaScript和Python将所有模式修饰符应用于整个正则表达式。它们不支持(?-ismx)语法,因为当模式修饰符应用于整个正则表达式时,关闭选项毫无意义。默认情况下,所有选项均已关闭。
您可以快速测试正在使用的正则表达式处理模式修饰符的方式。正则表达式(?i)te(? - i)st应匹配test和TEst,但不匹配teST或TEST。
答案 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
相匹配,但不能与teST
或TEST
相匹配。
不过, (?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/<$&>/g
(demo)"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])
regexp.MustCompile(`(?i:foo)|BAR`).ReplaceAllString( "fooFOOfOoFoOBARBARbarbarbAr", `<${0}>`)
(demo)