繁体   English   中英

逐行解析文本并使用Ruby返回子字符串

[英]Parsing text line by line and returning substrings with Ruby

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

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

巧合的是,它们的结构就像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>标记中搜索“ background”的实例,并在其下面的<string>标记中返回值。

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

使用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

正则表达式(不推荐,易碎):

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

暂无
暂无

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

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