逐行解析文本并使用Ruby

时间:2015-10-20 00:33:23

标签: ruby regex file parsing match

我不确定我在寻找什么,所以请耐心等待。

我有存储在数据库中的文本文件,我想根据我提供的值解析它们,并返回相对于找到匹配项的字符串值。我能想到的最好的事情是使用正则表达式来切掉值之前和之后的所有内容,但这看起来很愚蠢而且过于繁琐,文件长达数百行。

巧合的是,它们的结构与HTML一样,所以如果您愿意,我认为您可以将它们解析为HTML。

<key>settings</key>
<dict>
    <key>background</key>
    <string>#002b36</string>
    <key>caret</key>
    <string>#eee8d5</string>
    <key>foreground</key>
    <string>#839496</string>
    <key>gutter</key>
    <string>#073642</string>
    <key>invisibles</key>
    <string>#586e75</string>
    <key>lineHighlight</key>
    <string>#073642</string>
    <key>selection</key>
    <string>#2c4c55</string>
    <key>selectionBorder</key>
    <string>#586e75</string>
    <!-- Default looks best really -->
    <!-- <key>findHighlight</key> -->
    <!-- <string>#dddd45</string> -->
    <!-- <key>findHighlightForeground</key> -->
    <!-- <string>#fdf6e3</string> -->
</dict>

我在这里要完成的是在<key>标记中搜索“背景”的实例,并在其下面的<string>标记中返回值。

Ruby有一个.match函数,它返回子字符串的第一个实例。

1 个答案:

答案 0 :(得分:1)

使用Oga:

require 'oga'
doc = Oga.parse_xml(xml)
puts doc.at_xpath('//key[text()="background"]').next_element.text

没有宝石:

require 'rexml/document'
require 'rexml/xpath'
doc = REXML::Document.new("<doc>#{xml}</doc>")
puts REXML::XPath.first(doc, '//key[text()="background"]').next_element.text

Regexp(不推荐,易碎):

puts xml[/<key>background<\/key>\s*<string>([^<]*)<\/string>/, 1]