73

有人可以解释一下(?i)(?-i)正则表达式包装一个词是什么意思吗?

(?i)test(?-i)

我测试过,它匹配test,TESTteSt. 但我以前从未见过这种情况。?前面是什么i意思?我在这里看到了这个。

4

3 回答 3

109

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

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

更多信息请参见本页的“仅为正则表达式的一部分打开和关闭模式”部分

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

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

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

于 2013-02-28T21:10:49.317 回答
32

(?i)打开不区分大小写模式,(?-i)将其关闭。

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

于 2013-02-28T21:10:39.580 回答
10

直接取自 ruby​​ 文档。

正则表达式的结束分隔符后面可以跟一个或多个单字母选项,这些选项控制模式如何匹配。

/pat/i - 忽略大小写

/pat/m - 将换行符视为匹配的字符。

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

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

i、m 和 x 也可以使用 (?on-off) 构造应用于子表达式级别,该构造为括号括起来的表达式启用选项打开和禁用选项关闭。

于 2013-02-28T21:11:45.027 回答