【问题标题】:What is '?-mix' in a Ruby Regular Expression什么是 '?-mix' 在 Ruby 正则表达式中
【发布时间】:2015-04-22 05:56:21
【问题描述】:

只是尝试在 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。我应该为此担心吗?它来自哪里?

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    mix不是英文mix,是Regexp的选项。

    Regexp#to_s:

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

    在您的示例中,m 用于多行模式i 用于不区分大小写x 用于扩展模式时间>。 破折号之前的选项开启,之后的选项关闭(默认)。问题示例?-mix 已关闭所有选项。

    你可以像这样打开它们:

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

    【讨论】:

    • 太好了,谢谢。那个 m 选项可能是搞砸了我的 reg ex 的原因。只需要找出将其设置为单行即可
    • 值得注意的是,- 将这些选项 关闭 (默认情况下它们是,但您可以为正则表达式的不同部分打开和关闭它们,如果你的正则表达式支持的话)。
    • @Shantaram:你知道 Ruby 的 (?m) 与其他正则表达式的 (?s) 选项相同吗?您希望 ^$ 匹配什么?
    • 那么,如果这些选项默认关闭导致 ?-mix,这是否意味着 ?m-ix 已打开多行? (我在 - 之前移动了 m)
    【解决方案2】:

    关于-,它是标志的语法。破折号之前的那些是打开的,之后是关闭的。

    正如Regexp docs 中所述,这是一个内联修饰符,使用(?on-off) 语法:

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

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

    im,x 也可以通过 (?on-off) 构造应用于子表达式级别,该构造启用选项 on,并禁用选项 off em> 表示括号括起来的表达式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 2015-06-09
      • 2015-01-15
      • 2013-12-29
      相关资源
      最近更新 更多