ruby 正则表达式命名和组

标签 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
      puts value
      #self.send("#{pattern}=", value)
    end
  end
end

如您所见,我首先测试了我的正则表达式,然后我尝试将相同的正则表达式与命名组一起使用。

class Test
  attr_accessor :name, :type, :visible
  include Parser #add instance method (use extend if we need class method)
  def initialize(name)
    @name = name
    @type = "image"
    @visible = true
  end
end

t = Test.new("toto")
s='desciption{ name: "toto.test"; type: RECT; mouse_events: 0;'
puts t.type
t.fill(s, "type")
puts t.type

当我执行此命令时,第一个正则表达式起作用,但第二个不适用于命名组。 这是输出:

./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>'

最佳答案

如果=~与具有命名捕获的正则表达式文字一起使用,捕获的字符串(或 nil)被分配给由捕获名称命名的局部变量。

/(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/ =~ "  x = y  "
p lhs    #=> "x"
p rhs    #=> "y"

但是 - 正则表达式插值 #{} 也会禁用分配。

rhs_pat = /(?<rhs>\w+)/
/(?<lhs>\w+)\s*=\s*#{rhs_pat}/ =~ "x = y"
lhs    # undefined local variable

在您的情况下,来自以下代码:

if /\s#{pattern}\:\s*(?<value>\w+)\s*\;/ =~ line
   puts value
   #self.send("#{pattern}=", value)
end

看下面这行,你用了interpolation

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

因此,局部变量赋值没有发生,您在报告undefined local variable or method 'value'时得到了错误。

关于 ruby 正则表达式命名和组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933211/

相关文章:

ruby-on-rails - 赫罗库 |没有这样的应用程序 没有在该主机名上配置应用程序(已将域更改为新域)

python - 如何使用 2 个拆分参数拆分字符串?

python - 正则表达式在Python中用英文逗号替换中文标点符号

javascript - 使用python从js文件中解析多个注释

Java正则表达式字符串和空格之间的匹配

sql - has_many :through 的索引

javascript - 如何使用 Ajax 调用更新部分内容然后在 Rails 中呈现?

ruby - Ruby 中用于显示提示、获取输入和分配给变量的代码?

ruby - Splat 在非最终位置

java - Eclipse 表示此正则表达式中存在非法重复