Ruby MatchData post_match意外行为

时间:2017-06-02 11:00:11

标签: ruby regex

我正在将特殊变量$'与方法MatchData#post_match进行比较。特殊变量工作正常,但post_match方法失败。

这很好用:

m = /b/.match("abc")
# => #<MatchData "b">
m.post_match
# => "c"

"abc".match(/b/)
# => #<MatchData "b">
$'
# => "c"

这失败了:

"abc".match(/b/)
# => #<MatchData "b">
MatchData.post_match
# => NoMethodError: undefined method `post_match' for MatchData

我期待相同的输出'c'。为什么会失败?我错过了什么?

1 个答案:

答案 0 :(得分:1)

您应该在匹配数据的实例上调用post_match

match_data = "abc".match(/b/)
# => #<MatchData "b">
match_data.post_match
# => "c"

具有$前缀的全局变量很难处理。它可以在任何地方进行更改,并且很难跟踪它。此外,每次进行正则表达式匹配时,变量$'都会不断变化。当你在嵌套循环中进行正则表达式匹配时,这可能会成为一个麻烦;无论何时在内循环中执行某些操作,都可以在外循环中弄乱最后一个匹配。反之亦然。或者当你想在做一场不同的比赛后参考前一场比赛时,你就遇到了麻烦。

通过拥有匹配数据实例,您可以将其指定为局部变量,并在复杂情况下跟踪多个匹配数据。