我正在将特殊变量$'
与方法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'
。为什么会失败?我错过了什么?
答案 0 :(得分:1)
您应该在匹配数据的实例上调用post_match
。
match_data = "abc".match(/b/)
# => #<MatchData "b">
match_data.post_match
# => "c"
具有$
前缀的全局变量很难处理。它可以在任何地方进行更改,并且很难跟踪它。此外,每次进行正则表达式匹配时,变量$'
都会不断变化。当你在嵌套循环中进行正则表达式匹配时,这可能会成为一个麻烦;无论何时在内循环中执行某些操作,都可以在外循环中弄乱最后一个匹配。反之亦然。或者当你想在做一场不同的比赛后参考前一场比赛时,你就遇到了麻烦。
通过拥有匹配数据实例,您可以将其指定为局部变量,并在复杂情况下跟踪多个匹配数据。