在网页中,有一个包含以下内容的div -
<div id="test">
<p> This is first sentence. This is second sentence. This is third sentence. This is 4th sentence. </p>
</div>
现在,如何从上面的HTML片段中获取“这是第二句”的文本?我理解如何到达这个文本所在的div / p,但是如何只提取那个特定的句子?
同样,我如何提取前3个句子?而且,我如何选择最后2个句子?最后,您的Xquery表达式应该适用于任何类型的分隔符 - 如“。” /“,”/“;”等...
答案 0 :(得分:3)
使用fn:tokenize
解构字符串。
fn:tokenize(//p, "[\.,;]")[2]
模式可以是任何有效的正则表达式,您可以轻松满足您的需求。注意正则表达式的特殊字符。
对于前三个句子,请使用fn:position
:
tokenize(//p, "[\.,;]")[position() le 3]
对于更一般的分析,您可以使用范围表达式:
tokenize(//p, "[\.,;]")[position() = (2 to 3)]
并非所有点都结束了句子。为了更好地检测句子(尽管在所有情况下仍然没有保存),你可以做一些regex-foo:
tokenize(//p, '(?<=[\.,;])\s+(?=\p{Lu})')[2]
这会在所有空格字符(或多个字符,如果它们彼此跟随)之间分开,前面是上面列表中的字符,后跟大写字母。
警告:Lookahead和-behind不包含在XQuery标准中,因此受到每个实现的支持。即使支持它也可能不安全,因为这违反了标准并且可能被删除。我为此使用了BaseX 7.1.1。
答案 1 :(得分:2)
现在,如何从上面获得“这是第二句”的文字 HTML片段?
tokenize(/div/p, '\\.')[2]
同样,我如何提取前3个句子?
tokenize(/div/p, '\\.')[position() le 3]
另外,我如何选择最后2个句子?
tokenize(/div/p, '\\.')[position() gt last() -2]
最后,您的Xquery表达式应适用于任何类型的分隔符 - 喜欢 ”。” /“,”/“;”等...
使用tokenize()
字符串的第二个参数:'[.,;]'
答案 2 :(得分:2)
如何在fn中使用正则表达式:替换和捕获组?
它的优点是通过使用正则表达式而不是手动标记字符串= D
让您感觉更糟糕let $s := 'This is first sentence. This is second sentence. This is third sentence. This is 4th sentence.'
let $adjust-this-regex-as-needed := '([\w\s]+)\.([\w\s]+)\.([\w\s]+)\.([\w\s]+)\.'
return (
fn:replace($s, $adjust-this-regex-as-needed , '$1'), (: first sentence :)
fn:replace($s, $adjust-this-regex-as-needed , '$2 $3') (: last two sentences :)
)
([\ W \ S] +)\。 - &GT;表示匹配所有字母和空格,最多为句号