1

在网页中,有一个包含以下内容的 div——

<div id="test">
    <p> This is first sentence. This is second sentence. This is third sentence. This is 4th sentence. </p>
</div>

现在,如何从上面的 HTML 片段中获取文本“This is second sentence”?我了解如何到达该文本所在的 div/p,但如何仅提取该特定句子?

同样,我如何提取前 3 个句子?还有,我如何选择最后两句话?最后,您的 Xquery 表达式应该适用于任何类型的分隔符,例如“.”。/ "," / ";" ETC...

4

3 回答 3

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 and -behind 不包括在 XQuery 标准中,因此每个实现都支持。即使支持它也可能不安全,因为这违反了标准并且可能会被删除。我为此使用了 BaseX 7.1.1。

于 2012-07-28T14:27:06.527 回答
2

现在,如何从上面的 HTML 片段中获取文本“This is second sentence”?

tokenize(/div/p, '\\.')[2]

同样,我如何提取前 3 个句子?

tokenize(/div/p, '\\.')[position() le 3]

还有,我如何选择最后两句话?

tokenize(/div/p, '\\.')[position() gt last() -2]

最后,您的 Xquery 表达式应该适用于任何类型的分隔符,例如“.”。/ "," / ";" ETC...

tokenize()用作字符串的第二个参数,例如:'[.,;]'

于 2012-07-28T21:34:25.627 回答
2

如何将正则表达式与 fn:replace 和捕获组一起使用?

它的优点是通过使用正则表达式而不是手动标记字符串 =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]+)\. --> 表示匹配所有字母和空格直到一个句点

于 2012-07-29T09:16:36.163 回答