正则表达式中的`?i`和`?-i`是什么意思?

90

有人能解释一下在正则表达式中使用 (?i)(?-i) 包裹单词的含义吗?

(?i)test(?-i)

我测试了一下,它匹配了testTESTteSt。但我以前从未见过这个。在i之前的?是什么意思?我在这里看到的。
3个回答

125

(?i) 开启不区分大小写模式

(?-i) 关闭不区分大小写模式

更多信息请参见"在正则表达式的部分内容中开启和关闭模式"本页的章节:

现代正则表达式支持对正则表达式的部分应用修饰符。如果在正则表达式的中间插入修饰符(?ism),则该修饰符仅适用于修饰符右侧的正则表达式的部分。您可以通过在修饰符前面加上减号来关闭模式。减号后面的所有模式都将被关闭。例如,(?i-sm)打开不区分大小写模式,并关闭单行模式和多行模式。
并非所有正则表达式都支持此功能。JavaScript和Python将所有模式修饰符应用于整个正则表达式。它们不支持(?-ismx)语法,因为当模式修饰符应用于整个正则表达式时,关闭选项是无意义的。所有选项默认关闭。
您可以快速测试您正在使用的正则表达式如何处理模式修饰符。正则表达式(?i)te(?-i)st应匹配test和TEst,但不匹配teST或TEST。

Python 3确实支持(?i) - Robo Robok
所选答案已经有将近8年的历史了,当我写这篇文章时。链接到regular-expressions.info(我的第二个正则表达式网站,仅次于regex101)的页面上的语言已经发生了变化。我建议Python用户去查看一下。同样,他们应该查阅更新的相关文档https://docs.python.org/3.6/library/re.html#re.I。请注意,3.6版本的re.I文档与3.9版本的文档不同!最后,是的,我知道这原本是一个Ruby问题,但这个答案明确提到了Python,所以我想警告大家要关注更新。 - Malik A. Rumi

34

(?i) 开启 不区分大小写 模式,(?-i) 关闭该模式。

例如,如果您尝试使用 (?i)te(?-i)st,它将匹配 testTEsttEst,但不会匹配 teST


10

直接从 Ruby 文档中提取。

正则表达式的结束定界符可以后跟一个或多个单字母选项,用于控制模式匹配方式。

/pat/i - 忽略大小写

/pat/m - 认为换行符是 . 匹配的字符

/pat/x - 忽略模式中的空格和注释

/pat/o - 只执行一次 #{} 插值

i、m 和 x 也可以通过 (?on-off) 结构应用于子表达式级别,在括号内对所包含的表达式启用 on 选项并禁用 off 选项。


谢谢,我以前从来没有见过/i符号,但我习惯于使用(?i)符号。 - fIwJlxSzApHEZIl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接