繁体   English   中英

在Ruby中使用命名的Regex组

[英]Working with Named Regex Groups in Ruby

我试图通过一系列的行来匹配正则表达式组,并感到困惑。 数据文件中的行如下所示:

2014-03-01 08:19,47.799107662994,-75.876391553881,some comment,James,#tag

这是我的Ruby代码:

regex = /(?<day>.*)\s(?<hour>\d*:\d*),(?<lat>.*),(?<long>.*),(?<entry>.*),(?<people>.*),#(?<tag>.*)/

f = File.open("/Users/USERNAME/path/to/file.txt", encoding: 'UTF-8')
lines = f.read
f.close
lines.each_line do |line|
  if line =~ /&/
    line.gsub!(/[&]/, 'and')
  end

  if regex =~ line
    puts line
  end
end

那行得通, 但是如果我将倒数第三行更改为行,例如puts day ,那么我会收到一条错误消息,说那是未定义的局部变量。 我的理解是=~自动定义了这些变量。

知道我在做什么错吗?

您只能通过matchdata对象访问已named regex

regex = /(?<day>.*)\s(?<hour>\d*:\d*),(?<lat>.*),(?<long>.*),(?<entry>.*),(?<people>.*),#(?<tag>.*)/
line = "2014-03-01 08:19,47.799107662994,-75.876391553881,some comment,James,#tag"

matchdata = regex.match(line)

matchdata["day"] # => "2014-03-01"

so I would do as below instead:

if (matchdata = regex.match(line))
  puts matchdata["day"]
end

Ruby Rexexp文档

当命名的捕获组与表达式左侧的文字正则表达式和=〜运算符一起使用时,捕获的文本也将分配给具有相应名称的局部变量。

因此,它必须是用于创建局部变量的文字正则表达式。

在您的情况下,您正在使用变量来引用正则表达式,而不是文字。

例如:

regex = /(?<day>.*)/
regex =~ 'whatever'
puts day

NameError: undefined local variable or method `day' for main:Object产生NameError: undefined local variable or method `day' for main:Object ,但这

/(?<day>.*)/ =~ 'whatever'
puts day

打印whatever

尝试:

puts $~['day'] if regex =~ line

(有点神秘) $~全局变量是一个MatchData实例,用于存储最后一个正则表达式匹配的结果,您可以在其中访问命名的捕获。

但是@bjhaid的答案是一个更好的选择,显式保存MatchData。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM