【发布时间】:2014-01-30 19:30:05
【问题描述】:
我正在尝试解析包含名称后跟层次结构路径的文件。我想获取命名的正则表达式匹配,将它们转换为哈希键,并将匹配存储为哈希。每个哈希将被推送到一个数组(因此在解析整个文件后我将得到一个哈希数组。这部分代码正在工作,除了现在我需要处理具有重复层次结构的错误路径(top_* 始终是顶级)。看来,如果我在 Ruby 中使用命名反向引用,我需要命名 all 的反向引用。我已经在 Rubular 中得到了匹配,但现在我有 p1 反向引用我的结果哈希。
问题:在哈希中不包含 p1 键/值对的最简单方法是什么?我的方法用在其他地方,所以我们不能假设p1 总是存在。在调用 s_ary_to_hash 方法后,我是否坚持删除数组中的每个键/值对?
注意:我保留这个问题是为了尝试解决在我的方法中忽略某些哈希键的具体问题。正则表达式问题现在在这张票中:Ruby regex - using optional named backreferences
更新:正则表达式问题已解决,hier 现在始终存储在命名的“hier”组中。剩下的唯一一项是弄清楚如何在创建哈希之前删除“p1”键/值(如果它存在)。
示例文件:
name1 top_cat/mouse/dog/top_cat/mouse/dog/elephant/horse
new12 top_ab12/hat[1]/top_ab12/hat[1]/path0_top_ab12/top_ab12path1/cool
tops top_bat/car[0]
ab123 top_2/top_1/top_3/top_4/top_2/top_1/top_3/top_4/dog
预期输出:
[{:name => "name1", :hier => "top_cat/mouse/dog/elephant/horse"},
{:name => "new12", :hier => "top_ab12/hat[1]/path0_top_ab12/top_ab12path1/cool"},
{:name => "tops", :hier => "top_bat/car[0]"},
{:name => "ab123", :hier => "top_2/top_1/top_3/top_4/dog"}]
代码sn-p:
def s_ary_to_hash(ary, regex)
retary = Array.new
ary.each {|x| (retary << Hash[regex.match(x).names.map{|key| key.to_sym}.zip(regex.match(x).captures)]) if regex.match(x)}
return retary
end
regex = %r{(?<name>\w+) (?<p1>[\w\/\[\]]+)?(?<hier>(\k<p1>.*)|((?<= ).*$))}
h_ary = s_ary_to_hash(File.readlines(filename), regex)
【问题讨论】:
-
您有
.html/.xml文件吗?如果是,请使用nokogiri。 -
同意,但这不是 HTML 或 XML……这是另一个我无法触摸的程序的转储。
-
Greg,不管你用什么正则表达式,考虑把
s_ary_to_hash的三行换成ary.each_with_object([]) { |x, retry| .... }。 -
好提示,我忘记了
|x, retry|收集结果的方式。谢谢! -
@Greg,当我测试你的代码时,我没有得到你预期输出的最后一行。你能检查一下吗?