我试图在一系列行上匹配正则表达式组,但被难住了。数据文件的行如下所示:
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
,那么我会收到一条错误消息,指出这是一个未定义的局部变量。我的理解是 =~
自动定义了这些变量。
知道我做错了什么吗?
最佳答案
来自Ruby Rexexp docs :
When named capture groups are used with a literal regexp on the left-hand side of an expression and the =~ operator, the captured text is also assigned to local variables with corresponding names.
因此它需要是一个用于创建局部变量的文字正则表达式。
在您的情况下,您使用变量来引用正则表达式,而不是文字。
例如:
regex = /(?<day>.*)/
regex =~ 'whatever'
puts day
产生NameError:未定义的局部变量或方法`day' for main:Object
,但是这个
/(?<day>.*)/ =~ 'whatever'
puts day
打印任何内容
。
关于ruby - 在 Ruby 中使用命名正则表达式组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116634/