繁体   English   中英

Ruby正则表达式解析

[英]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'] }

或类似。

您可以使用此正则表达式模式

/(?<="name":")([\w\s]+)/

含义:

(?<="name":")将查找"name":" ,但不会将它们包括在positive look-behind结果中

([\\w\\s]+)将匹配包含字母或空格的字符串,在这种情况下,直到字符"即名称

您还可以检查以下站点: RubularRegex101 ,这可以帮助您构建正则表达式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM