什么是 '?-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
- 只执行一次#
插值
i
、m,
和x
也可以通过(?on-off)
构造应用于子表达式级别,该构造启用选项 on,并禁用选项 off em> 表示括号括起来的表达式。
因此,在我的情况下,这意味着选项 m
、i
和 x
处于关闭状态,并且没有处于打开状态。
【讨论】:
以上是关于什么是 '?-mix' 在 Ruby 正则表达式中的主要内容,如果未能解决你的问题,请参考以下文章
Ruby PDF::Reader 使用正则表达式匹配项目符号
php 中preg_replace执行一个正则表达式的搜索和替换
php正则替换函数-----preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1