我有如下代码:
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]"
为什么会发生这种情况?
这是因为正则表达式/#{$1}/
变成了/faɪnd/
。当此正则表达式与'英 [faɪnd] 美 [faɪnd]'
匹配时,
- 第一捕获
$1
将是nil
,因为/faɪnd/
不具有捕获组 - 词缀
$'
变为"] 美 [faɪnd]"
,它正好在匹配之后
目前尚不清楚您认为是如何设置$1的。它不是像Bash中那样的位置参数;它是Regexp类中描述的一个特殊全局变量1设置为最后一场比赛的第一个捕获组。
考虑:
"foo".match /(foo)/; $1
#=> "foo"
"foo".match /foo/; $1
#=> nil