xquery-如何选择文本occ。在第n次出现分隔符之后/如何提取前n个句子/最后n个句子

时间:2012-07-28 13:52:50

标签: xquery

在网页中,有一个包含以下内容的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表达式应该适用于任何类型的分隔符 - 如“。” /“,”/“;”等...

3 个答案:

答案 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;表示匹配所有字母和空格,最多为句号