在Ruby中如何存储正则表达式的匹配结果?

3

我正在使用Ruby解析一个文件,以更改数据格式。我创建了一个正则表达式,其中有三个匹配组,我想将它们暂时存储在变量中。我遇到了问题,因为所有的匹配都是nil,无法存储。

以下是我从阅读中得到的内容:

regex = '^"(\bhttps?://[-\w+&@#/%?=~_|$!:,.;]*[\w+&@#/%=~_|$])","(\w+|[\w._%+-]+@[\w.-]+\.[a-zA-Z]{2,4})","(\w{1,30})'

begin
  file = File.new("testfile.csv", "r")
  while (line = file.gets)
    puts line
    match_array = line.scan(/regex/)
    puts $&
  end
  file.close
end

这是一些我用于测试的样本数据。

"https://mail.google.com","Master","password1","","https://mail.google.com","",""
"https://login.sf.org","monster@gmail.com","password2","https://login.sf.org","","ctl00$ctl00$ctl00$body$body$wacCenterStage$standardLogin$tbxUsername","ctl00$ctl00$ctl00$body$body$wacCenterStage$standardLogin$tbxPassword"
"http://www.facebook.com","Beast","12345678","https://login.facebook.com","","email","pass"
"http://www.own3d.tv","Earth","passWOrd3","http://www.own3d.tv","","user_name","user_password"

谢谢您,
LF4
1个回答

5
这不行:
match_array = line.scan(/regex/)

这只是将字面量“regex”字符串作为您的正则表达式使用,而不是使用您的regex变量中的内容。您可以直接将庞大且难看的正则表达式放入scan中,或者创建一个Regexp实例:

regex = Regexp.new('^"(\bhttps?://[-\w+&@#/%?=~_|$!:,.;]*[\w+&@#/%=~_|$])","(\w+|[\w._%+-]+@[\w.-]+\.[a-zA-Z]{2,4})","(\w{1,30})')
# ...
match_array = line.scan(regex)

建议使用CSV库(Ruby自带一个:1.8.71.9)来解析CSV文件,然后对CSV中的每一列应用正则表达式。这样做可以避免引号和转义问题。


哇,谢谢。我很惊讶所有的搜索都没有提到或展示如何使用Regexp.new的例子。这就做到了。再次感谢。 - krizzo
@LF4:我认为你应该使用CSV解析器和3个更简单的正则表达式。无论如何,对于那么复杂的正则表达式,将它们放在一个变量中(当然是正确类型的变量),并在“scan”调用中引用该变量是正确的做法。 - mu is too short
是的,使用CSV解析器要容易得多。我不知道为什么我没有想到去研究它,而是用正则表达式。 :) 感谢您的所有帮助。 - krizzo
@LF4:当你手中只有一把锤子时……陷入错误的方法并试图让它工作,最终徒劳无功是标准的人类行为,我们都会这样做。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接