什么是 '?-mix' 在 Ruby 正则表达式中

Posted

技术标签:

【中文标题】什么是 \'?-mix\' 在 Ruby 正则表达式中【英文标题】: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。我应该为此担心吗?它来自哪里?

【问题讨论】:

【参考方案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 处于关闭状态,并且没有处于打开状态。

【讨论】:

以上是关于什么是 '?-mix' 在 Ruby 正则表达式中的主要内容,如果未能解决你的问题,请参考以下文章

Ruby PDF::Reader 使用正则表达式匹配项目符号

php正则表达怎么把一个字符串中的所有空格都转化为下划线

Ruby 正则表达式 \1 对 gsub 意味着啥

php 中preg_replace执行一个正则表达式的搜索和替换

Ruby:正则表达式中的十六进制

php正则替换函数-----preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1