类似正则表达式匹配的xpath表达式?

我想在某个模式的html doc中搜索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]') 

仍然失败。 错误信息:

无法计算表达式’ //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()函数 :

 "//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, '_')) >= 0 and number(substring-after(@id, '_')) <= 99999999]" 

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

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

正如已经指出的那样,在XPath 2.0中 ,使用matches()函数之类的函数来使用其标准正则表达式function会更好。

一个可能的XPath 1.0解决方案

 //div[starts-with(@id, 'post_message_') and string-length(@id) = 21 and translate(substring-after(@id, 'post_message_'), '0123456789', '' ) = '' ] 

请注意以下事项

  1. 使用标准XPath函数starts-with()

  2. 使用标准的XPath函数string-length()

  3. 使用标准的XPath函数substring-after()

  4. 使用标准的XPath函数translate()

或者使用xpath函数匹配(字符串,模式)。

   

不幸的是它不是正则表达式,但它可能就足够了,除非你有其他不需要的foo_标签,然后我猜你可以添加一些“if”检查来剔除它们。

Nikkou使这非常简单易读:

 doc.search('div').attr_matches('id', /post_message_\d{1,8}/)