我们可以只区分大小写的正则表达式吗?
我已经看到了很多使整个正则表达式不区分大小写的示例。我想知道的是让表达式的一部分不区分大小写。
例如,假设我有一个像这样的字符串:
fooFOOfOoFoOBARBARbarbarbAr
如果我想匹配所有出现的" foo"(无论大小写),但我只想匹配大写的" BAR"怎么办?
理想的解决方案是可以在正则表达式中使用的解决方案,但我也想听听特定于语言的解决方案(谢谢Espo)
编辑
Espo提供的链接非常有帮助。那里有一个很好的例子,可以在表达式中打开和关闭修饰符。
对于我想做的示例,我可以执行以下操作:
(?i)foo*(?-i)|BAR
这使得匹配仅对匹配的foo部分不区分大小写。
除Javascript,Python和其他一些(如Espo所述)外,这似乎在大多数正则表达式实现中均有效。
我所想知道的大公司(Perl,PHP,.NET)都支持内联模式更改。
解决方案
回答
Perl使我们可以使用(?i :)模式修饰符使正则表达式的一部分不区分大小写。
现代的regex风格允许我们仅将修饰符应用于正则表达式的一部分。如果在正则表达式的中间插入修饰符(?ism),则修饰符仅适用于修饰符右侧的正则表达式部分。我们可以通过在模式前面加上减号来关闭模式。减号之后的所有模式都将关闭。例如。 (?i-sm)启用不区分大小写的功能,并同时关闭单行模式和多行模式。
并非所有的正则表达式都支持此功能。 JavaScript和Python将所有模式修饰符应用于整个正则表达式。它们不支持(?-ismx)语法,因为当模式修饰符应用于整个正则表达式时,关闭选项毫无意义。默认情况下,所有选项都是关闭的。
我们可以快速测试我们使用的正则表达式味道如何处理模式修饰符。正则表达式(?i)te(?-i)st应该匹配test和TEst,但不能匹配teST或者TEST。
来源
回答
你可以用
(?:F|f)(?:O|o)(?:O|o)
.Net括号中的?:表示不捕捉,仅用于对||的术语进行分组。 (或者)声明。
回答
我们使用什么语言?做到这一点的标准方法是类似/([Ff] [Oo] {2} | BAR)/并区分大小写,但是例如在Java中,有一个区分大小写修饰符(?i)可以使所有右边的字符不区分大小写,而(?-i)则强制敏感。可以在此处找到该Java regex修饰符的示例。
回答
不幸的是,不区分大小写的匹配的语法并不常见。
在.NET中,我们可以使用RegexOptions.IgnoreCase标志或者?i修饰符