gpt4 book ai didi

ruby - 用于类似正则表达式匹配的 xpath 表达式?

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:00 26 4
gpt4 key购买 nike

我想在具有特定模式的 html 文档中搜索 div id。我想在正则表达式中匹配这个模式:

foo_([[:digit:]]{1.8})

使用 xpath。上述模式的 xpath 等价物是什么?

我坚持 //div[@id="foo_然后什么?如果有人能为它继续一个合法的表达。

编辑

抱歉,我想我必须详细说明一下。其实不是 foo_ ,它是 post_message_

顺便说一句,我使用 mechanize/nokogiri ( ruby​​ )

这是片段:

html_doc = Nokogiri::HTML(open(myfile))
message_div = html_doc.xpath('//div[substring(@id,13) = "post_message_" and substring-after(@id, "post_message_") => 0 and substring-after(@id, "post_message_") <= 99999999]')

还是失败了。错误信息:

Couldn't evaluate expression '//div[substring(@id,13) = "post_message_" and substring-after(@id, "post_message_") => 0 and substring-after(@id, "post_message_") <= 99999999]' (Nokogiri::XML::XPath::SyntaxError)

最佳答案

这个怎么样(更新):

XPath 1.0:

"//div[substring-before(@id, '_') = 'foo' 
and substring-after(@id, '_') >= 0
and substring-after(@id, '_') <= 99999999]"

编辑 #2:OP 对问题进行了更改。以下更简化的 XPath 1.0 表达式对我有用:

"//div[substring(@id, 1, 13) = 'post_message_' 
and substring(@id, 14) >= 0
and substring(@id, 14) <= 99999999]"

XPath 2.0 有一个方便的 matches() function :

"//div[matches(@id, '^foo_\d{1,8}$')]"

除了更好的可移植性之外,我希望数值表达式(XPath 1.0 样式)比正则表达式测试执行得更好,尽管这只有在处理大型数据集时才会变得明显。


原版答案:

"//div[substring-before(@id, '_') = 'foo' 
and number(substring-after(@id, '_')) = substring-after(@id, '_')
and number(substring-after(@id, '_')) &gt;= 0
and number(substring-after(@id, '_')) &lt;= 99999999]"

number() 函数的使用是不必要的,因为数学比较运算符将它们的参数隐式地强制转换为数字,任何非数字都将变为 NaN 并且更大的小于/小于测试将失败。

我还删除了尖括号的编码,因为这是 XML 要求,而不是 XPath 要求。

关于ruby - 用于类似正则表达式匹配的 xpath 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597944/

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