1

我正在玩,看看如何Regex#to_s禁用该模式的选项%r/../。但是对这样的输出感到困惑Regex#to_s

irb(main):005:0> %r/ab+c/x.to_s
=> "(?x-mi:ab+c)"   #why here -m option has been disabled?

irb(main):006:0> %r/ab+c/i.to_s
=> "(?i-mx:ab+c)"   #why here -m option has been disabled?

irb(main):007:0> %r/ab+c/m.to_s
=> "(?m-ix:ab+c)"   #why here -i option has been disabled?

irb(main):008:0> %r/ab+c/o.to_s
=> "(?-mix:ab+c)"   #why here o option not get into the (...) as the above?

irb(main):009:0> %r/ab+c/.to_s
=> "(?-mix:ab+c)"   #why always m,i,x option get into the (...) as the above?

任何人都可以在这里帮助我了解选项开启/关闭的逻辑吗?

Regex#hashRegex#quote方法在 Ruby 1.9.3 中如何工作(任何小代码都可以理解)?

4

1 回答 1

2

我认为你的理解是颠倒的;破折号左侧的选项打开,而破折号右侧的选项关闭。

/ab+c/x => "x-mi"
/ab+c/i => "i-mx"
/ab+c/m => "m-ix"

这三个选项中的每一个都出现在每个正则表达式字符串中,但它们出现在破折号的左侧或右侧表明该选项是打开还是关闭。

关于您的第二个问题,Regexp#hash只是一种为给定正则表达式生成相同 Fixnum 的方法。这允许您比较两个不同的正则表达式选项以获得有效的相等性。有关详细信息,请参阅Object#hash 。

于 2013-01-19T14:13:00.090 回答