ruby - 在 Ruby 中使用命名正则表达式组

标签 ruby regex

我试图在一系列行上匹配正则表达式组,但被难住了。数据文件的行如下所示:

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/

相关文章:

ruby - 从模式创建表?使用 Ruby Sequel gem

javascript - 在 Javascript 中使用插入符号作为指数

javascript - 基于正则表达式的字符串修改

javascript - 用于检查数字字段不具有/或具有所有相同数字的正则表达式

ruby-on-rails - 在 ruby​​ on rails 中,如何将 ActiveSupport::TimeWithZone 中的时间转换为月、日、年?

ruby-on-rails - Ruby - 嵌套 IF 语句语法

ruby-on-rails - 使用多个 ifs 重构 rails 重定向

ruby-on-rails - 运行 db :migrate 时出现段错误

php - textarea 接受输入类型文本的 12 个逗号分隔值

regex - 如何更改反向引用的大小写?