我们可以只区分大小写的正则表达式吗?

时间:2020-03-05 18:47:34  来源:igfitidea点击:

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

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

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修饰符