你可以只是正则expression式不区分大小写的一部分?
我见过很多使整个正则expression式不区分大小写的例子。 我想知道的只是expression式的一部分不区分大小写。
例如,假设我有这样一个string:
fooFOOfOoFoOBARBARbarbarbAr
如果我想匹配“foo”的所有事件而不pipe情况如何,但我只想匹配大写的“BAR”?
理想的解决scheme应该是跨越正则expression式的东西,但我也有兴趣听到语言特定的(以及埃斯波 )
编辑
Espo提供的链接非常有帮助。 在这里有一个关于在expression式中打开和closures修饰符的很好的例子。
对于我所做的例子,我可以做这样的事情:
(?i)foo*(?-i)|BAR
这使匹配不区分大小写匹配的foo部分。
这似乎工作在大多数正则expression式实现,除了Javascript,Python和一些其他(如Espo提到)。
我想知道的大部分(Perl,PHP,.NET)都支持内联模式更改。
Perl允许你通过使用(?i :)模式修饰符来使你的正则expression式不区分大小写。
现代正则expression式风格允许您将修饰符仅应用于正则expression式的一部分。 如果在正则expression式的中间插入修饰符(?ism),则修饰符仅适用于修饰符右侧的正则expression式部分。 您可以通过在减号前加上closures模式。 减号后的所有模式都将被closures。 例如(?i-sm)打开不区分大小写,closures单线模式和多线模式。
并非所有的正则expression式都支持这一点。 JavaScript和Python将所有模式修饰符应用于整个正则expression式。 它们不支持(?-ismx)语法,因为当模式修饰符应用于整个正则expression式时,closures某个选项毫无意义。 所有选项默认closures。
您可以快速testing您正在使用的正则expression式处理模式修饰符的方式。 正则expression式(?i)te(? – i)st应该匹配test和TEst,而不是teST或者TEST。
资源
不幸的是,不区分大小写匹配的语法并不常见。 在.NET中,您可以使用RegexOptions.IgnoreCase标志或?i修饰符
你使用什么语言? 一个标准的方法是像/([Ff] [Oo] {2} | BAR)/区分大小写,但在Java中,例如,有一个区分大小写修饰符(?i)右边的字符不区分大小写,(?-i)强制敏感。 Java正则expression式修饰符的一个例子可以在这里find。
你可以使用
(?:F|f)(?:O|o)(?:O|o)
在.Net的括号中的?:表示它是不捕获的,只是用来将|的术语分组 (或)声明。