ruby正则表达式命名和组

ruby正则表达式命名和组,ruby,regex,Ruby,Regex,我试图在正则表达式中使用命名组,但它不起作用: module Parser def fill(line, pattern) if /\s#{pattern}\:\s*(\w+)\s*\;/ =~ line puts Regexp.last_match[1] #self.send("#{pattern}=", value) end if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line

我试图在正则表达式中使用命名组,但它不起作用:

module Parser
  def fill(line, pattern)
    if /\s#{pattern}\:\s*(\w+)\s*\;/ =~ line
      puts Regexp.last_match[1]
      #self.send("#{pattern}=", value)
    end
    if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
      puts value
      #self.send("#{pattern}=", value)
    end
  end
end
当我执行此操作时,第一个正则表达式可以工作,但第二个正则表达式不能与命名组一起工作。 以下是输出:

./ruby_mixin_test.rb
image
RECT
./ruby_mixin_test.rb:11:in `fill': undefined local variable or method `value' for 
#<Test:0x00000001a572c8> (NameError)
from ./ruby_mixin_test.rb:34:in `<main>'
/ruby\u mixin\u test.rb
形象
直肠
./ruby\u mixin\u test.rb:11:in'fill:未定义的局部变量或方法'value'
#(名称错误)
from./ruby\u mixin\u test.rb:34:in`'

您尚未在模块中定义

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
  puts value  # This is not defined anywhere
  [..]
if/\s{pattern}\:\s*(?\w+)\s*\/=~线
puts value#这在任何地方都没有定义
[..]

您尚未在模块中定义

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
  puts value  # This is not defined anywhere
  [..]
if/\s{pattern}\:\s*(?\w+)\s*\/=~线
puts value#这在任何地方都没有定义
[..]
如果与带有命名捕获的regexp文本一起使用,则捕获的字符串(或nil)被分配给由捕获名称命名的局部变量

/(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/ =~ "  x = y  "
p lhs    #=> "x"
p rhs    #=> "y"
在您的情况下,请使用以下代码:

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
   puts value
   #self.send("#{pattern}=", value)
end
if/\s{pattern}\:\s*(?\w+)\s*\/=~线
重视
#self.send(“#{pattern}=”,value)
结束
看下面的一行,您使用插值

/\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
 ~~^
/\s{pattern}\:\s*(?\w+)\s*\/=~线
~~^
因此,局部变量分配没有发生,并且在报告未定义的局部变量或方法“value”时出现错误。

如果与带有命名捕获的regexp文本一起使用,则捕获的字符串(或nil)被分配给由捕获名称命名的局部变量

/(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/ =~ "  x = y  "
p lhs    #=> "x"
p rhs    #=> "y"
在您的情况下,请使用以下代码:

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
   puts value
   #self.send("#{pattern}=", value)
end
if/\s{pattern}\:\s*(?\w+)\s*\/=~线
重视
#self.send(“#{pattern}=”,value)
结束
看下面的一行,您使用插值

/\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
 ~~^
/\s{pattern}\:\s*(?\w+)\s*\/=~线
~~^

因此,局部变量赋值没有发生,您报告了未定义的局部变量或方法“值”,因此出现了错误。

您的答案非常令人费解。你有一些消息来源吗?你的回答非常无误。你有一些消息来源吗?