[英]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.