在正则expression式中,“?”和“?-i”是什么意思?

有人能解释什么(?i)(?-i)在正则expression式中包装一个单词吗?

 (?i)test(?-i) 

我testing过,它符合testTESTteSt 。 但是我从来没有见过这个。 这是什么?i意思? 我在这里看到这个

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

(?-i)closures了不区分大小写的模式

更多信息请参阅本页“仅用于正则expression式部分的打开和closures模式”部分 :

现代正则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。

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

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

直接从ruby文档。

正则expression式的结尾分隔符后面可以跟一个或多个单字母选项,用于控制模式如何匹配。

/ pat / i – 忽略大小写

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

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

/ pat / o – >仅执行一次插值

i,m和x也可以通过(?on-off)构造应用在子expression级别上,这样可以启用选项,并禁用圆括号所包含expression式的选项。