我想要搜索具有某种模式的html文档中的div id.
我想在正则表达式中匹配这个模式:
我想在正则表达式中匹配这个模式:
foo_([[:digit:]]{1.8})
使用xpath.上述模式的xpath相当于什么?
我被卡在// div [@ id =“foo_然后什么?如果有人可以继续为其表达法律.
编辑
对不起,我想我必须详细说明一下.其实不是foo_,它是post_message_
Btw,我用机械/ nokogiri(红宝石)
这是代码段:
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,"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,'_')) >= 0 and number(substring-after(@id,'_')) <= 99999999]"
使用number()函数是不必要的,因为数学比较运算符隐含地将它们的参数强制转换为数字,任何非数字将变为NaN,并且大于/小于测试将失败.
我还删除了尖括号的编码,因为这是XML要求,而不是XPath要求.