为什么我的正则表达式匹配没有设置$ 1?

时间:2014-10-07 12:40:03

标签: ruby regex global-variables

我的代码如下:

require 'colored'
require 'byebug'

str = '英 [faɪnd] 美 [faɪnd]'
regex = /\[([^\[\]]*)\]/
blk = Proc.new{|mat| mat.send(:yellow)}

to_search = str.dup
while regex =~ to_search do
  byebug
  str.sub! /#{$1}/, blk.call($1)
  ...
end

str.sub! /#{$1}/, blk.call($1)之前,

  • $1"faɪnd"
  • $'" 美 [faɪnd]"

之后,

  • $1nil
  • $'"] 美 [faɪnd]"

为什么会这样?

2 个答案:

答案 0 :(得分:1)

这是因为正则表达式/#{$1}/变为/faɪnd/。当此正则表达式与'英 [faɪnd] 美 [faɪnd]'匹配时,

  • 第一次捕获$1将为nil,因为/faɪnd/没有捕获组。
  • 词缀$'变为"] 美 [faɪnd]",就在比赛结束后。

答案 1 :(得分:0)

您不清楚如何设置 $ 1 。它不是像Bash那样的位置参数;它是Regexp类中描述的special global variable $ 1 设置为上一场比赛的第一个捕获组

考虑:

"foo".match /(foo)/; $1
#=> "foo"

"foo".match /foo/;   $1
#=> nil