首页 文章

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

提问于
浏览
90

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

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

fooFOOfOoFoOBARBARbarbarbAr

如果我想匹配所有出现的“foo”而不管大小写但我只想匹配大写的“BAR”怎么办?

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

Edit

Espo提供的链接非常有用 . 关于在表达式中打开和关闭修改器的例子很好 .

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

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

这使得匹配仅对匹配的foo部分不区分大小写 .

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

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

4 回答

  • 6

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

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

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

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

    Source

  • 6

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

  • 4

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

  • 81

    你可以用

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

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

相关问题