我的代码如下:
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]"
之后,
$1
是nil
$'
是"] 美 [faɪnd]"
为什么会这样?
答案 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