[英]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
当命名的捕获组与表达式左侧的文字正则表达式和=〜运算符一起使用时,捕获的文本也将分配给具有相应名称的局部变量。
因此,它必须是用于创建局部变量的文字正则表达式。
在您的情况下,您正在使用变量来引用正则表达式,而不是文字。
例如:
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.