[英]Ruby regex parsing
我正在尝试解析一个文本文件。 以下格式的出现被掩埋在连续的文本中(例如,它们永远不在行的开头):
"name":"Fred Flintstone","neighborhood": ...
... "name":"Barney Rubble","address":
我需要找到"name":
的出现"name":
。 name
出现在其他地方,因此只有带引号和冒号的单词name
应匹配。 然后,我需要在后面的第一对引号中打印或存储文本。 我想只用Barney Rubble
清洗, Fred Flintstone
用另一条清洗。
这是我想出的:
File.open('textfile.txt','r') do |s|
s.each_line do |eachline|
wordmatch = eachline.match(/"name":"(.*?)(?=["])/)
puts wordmatch
end
end
但这不起作用。 结果显示如下:
(lots of space)
"name":"random"
(lots of space)
"name":"Barney Rubble
它打印很多空格。 它也没有显示所有结果。 我不明白为什么。
因此,如果感到困惑,我们深表歉意。 只是为了澄清。 在解析器找到“名称”之后:需要选择/存储/打印第一个,紧随其后的引号内的所有内容。 在第一个示例中,仅应选择Fred Flintsone,直到遇到下一个“名称”:之前,不要做其他任何事情。 引号内的任何字符和空格都是合法的。
您可以使用非贪婪的表达式来做到这一点:
s = '"name":"Fred Flintstone","neighborhood":"foo","name":"Barney Rubble","address":"bar"'
s.scan(/"name":"(.*?)"/).flatten # => ["Fred Flintstone", "Barney Rubble"]
match
仅在一行中找到第一个匹配项; 听起来每行可能有多个匹配项,在这种情况下,您需要对循环体使用scan
:
File.read('textfile.txt').scan(/"name":"([^"]*)"/) do |wordmatch|
puts wordmatch
end
但是这种格式看起来像JSON一样,如果是JSON,则应该这样处理:
require 'json'
require 'pp'
obj = JSON.parse(File.read 'textfile.txt')
pp obj
然后看一下结构,它可能是哈希数组,所以您想要的是
puts obj.map { |o| o['name'] }
或类似。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.