gpt4 book ai didi

ruby - 如何在不知道其名称的情况下使用其内容的正则表达式获取 XML 子标签

转载 作者:数据小太阳 更新时间:2023-10-29 02:21:07 24 4
gpt4 key购买 nike

我的 XML 简化后看起来像这样:

node_set = Nokogiri::XML('
<PARENT>
<SOME_TAG>12:12:1222</SOME_TAG>
<HOLY_TAG>12:12:1222</HOLY_TAG>
<MAJOR_TAG>12:12:1222</MAJOR_TAG>
<FOO_FOO>12:12:1222</FOO_FOO>
</PARENT>'
)

我所知道的只是如何为此编写正则表达式:

(\d+):(\d+):(\d+)

我在官方网站上阅读了一些有关正则表达式匹配的文章,但没有找到如何进行匹配的答案。只有机制如何将用户函数调用到 xpath 方法中。

我如何在不知道正则表达式名称的情况下获得所有这些标签?

最佳答案

Nokogiri 不支持 XPath 2.0 matches函数,因此您需要使用 Ruby 来执行正则表达式:

hits = node_set.xpath("//text()").grep(/\d+:\d+:\d+/).map(&:parent)
p hits.map(&:name)
#=> ["SOME_TAG", "HOLY_TAG", "MAJOR_TAG", "FOO_FOO"]

描述:

  1. 查找整个文档中的所有文本节点。
  2. 将列表缩减为仅包含与所需正则表达式匹配的列表。
  3. 将列表映射到每个文本节点的父元素。

Enumerable#grep方法是 .select{ |text| 的简写正则表达式 === 文本 }

或者,请注意您可以定义自己的custom XPath functions in Nokogiri回调 Ruby,因此您可以假装使用 XPath 2.0 匹配:

module FindWithRegex
def self.matches(nodes,pattern,flags=nil)
nodes.grep(Regexp.new(pattern,flags))
end
end

hits = node_set.xpath('//*[matches(text(),"\d+:\d+:\d+")]',FindWithRegex)
p hits.map(&:name)
#=> ["SOME_TAG", "HOLY_TAG", "MAJOR_TAG", "FOO_FOO"]

但是,由于这是为每个找到的节点重新调用的事实(因此每次都从字符串重新创建一个新的正则表达式),它的效率几乎没有:

require 'benchmark'
Benchmark.bm(15) do |x|
N = 10000
x.report('grep and map'){ N.times{
node_set.xpath("//text()").grep(/\d+:\d+:\d+/).map(&:parent)
}}
x.report('custom function'){ N.times{
node_set.xpath('//*[matches(text(),"\d+:\d+:\d+")]',FindWithRegex)
}}
end

#=> user system total real
#=> grep and map 0.437000 0.016000 0.453000 ( 0.442044)
#=> custom function 1.653000 0.031000 1.684000 ( 1.694170)

您可以通过缓存正则表达式来加快速度:

module FindWithRegex
REs = {}
def self.matches(nodes,pattern,flags=nil)
nodes.grep(REs[pattern] ||= Regexp.new(pattern,flags))
end
end

#=> user system total real
#=> grep and map 0.437000 0.016000 0.453000 ( 0.442044)
#=> cached regex 0.905000 0.000000 0.905000 ( 0.896090)

关于ruby - 如何在不知道其名称的情况下使用其内容的正则表达式获取 XML 子标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com