一个Ruby正则表达式中的'?-mix'是什么?

44

我在尝试调试Ruby中的正则表达式。当我打印正则表达式的内容时,即使这些字符不是表达式的一部分,它仍然在正则表达式的开头显示?-mix。请查看以下IRB输出以了解此情况的说明。

irb(main):028:0* EXPR = /^a$/
=> /^a$/
irb(main):029:0> EXPR
=> /^a$/
irb(main):030:0> puts EXPR
(?-mix:^a$)
=> nil

如您所见,当使用puts打印正则表达式的内容时,会出现以 ?-mix 开头的内容。我应该担心吗?它是从哪里来的?

2个回答

57

mix不是英语单词mix,它是Regexp选项。

参考Regexp#to_s

返回一个字符串,其中包含正则表达式及其选项(使用(?opts:source)表示法)。

在您的示例中,m用于启用多行模式,i用于忽略大小写,x用于扩展模式。 破折号前的选项为开启状态,破折号后的选项为关闭状态(默认)。问题示例中的?-mix所有选项都为关闭状态。

您可以像这样打开它们:

puts /^a$/mix
# =>(?mix:^a$)

非常好,谢谢你。可能是那个 m 选项搞乱了我的正则表达式。我只需要找出如何将它设置为单行模式即可。 - Plastikfan
值得注意的是,- 符号会将这些选项 关闭(它们默认是关闭的,但如果您的正则表达式支持,您可以在不同的正则表达式部分中打开和关闭它们)。 - Tim Pietzcker
@Shantaram:你知道 Ruby 中的 (?m) 和其他正则表达式引擎中的 (?s) 是一样的吗?你期望 ^$ 匹配什么内容? - Tim Pietzcker
所以,如果这些选项默认关闭,导致出现?-mix,那么这是否意味着?m-ix已经打开了多行模式?(我将m移动到了-之前) - Plastikfan

18

关于-,它是标志语法。横线之前的标志为开启状态,横线之后的标志为关闭状态。

正则表达式文档所述,这是一种内联修饰符,使用(?on-off)语法:

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

  • /pat/i - 忽略大小写
  • /pat/m - 将换行符视为.匹配的字符
  • /pat/x - 忽略模式中的空格和注释
  • /pat/o - 只执行一次#{}插值

imx也可以在子表达式级别上应用(?on-off)结构,这使得括号内包含的表达式启用选项on,禁用选项off

因此,在我的情况下,这意味着选项mix均为关闭状态,并且没有打开任何选项。


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