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



我有如下代码:

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

相关内容

  • 没有找到相关文章

最新更新