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

xquery-如何选择文本occ。第n次出现分隔符后/如何提取前n个句子/后n个句子,xquery,Xquery,在网页中,有一个包含以下内容的div-- 这是第一句话。这是第二句话。这是第三句话。这是第四句话 现在,我如何从上面的HTML片段中获取文本“这是第二句话”?我理解如何到达文本所在的div/p,但如何只提取特定的句子 同样,我如何提取前3个句子?还有,我如何选择最后两个句子?最后,您的Xquery表达式应该适用于任何类型的分隔符,如“/”、“/”;“等。在点处拆分 用于解构字符串 fn:tokenize(//p, "[\.,;]")[2] 模式可以是任何有效的正则表达式,它将很容易满足您的

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


这是第一句话。这是第二句话。这是第三句话。这是第四句话

现在,我如何从上面的HTML片段中获取文本“这是第二句话”?我理解如何到达文本所在的div/p,但如何只提取特定的句子

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

在点处拆分 用于解构字符串

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]
tokenize(//p,”(?在点处拆分
用于解构字符串

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]
tokenize(//p,”(?
现在,我如何从上面获得文本“这是第二句话”
HTML片段

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

还有,我如何选择最后两个句子

最后,您的Xquery表达式应该适用于任何类型的分隔符- 比如“/”,“/”;“等等

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

现在,我如何从上面获得文本“这是第二句话” HTML片段

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

还有,我如何选择最后两个句子

最后,您的Xquery表达式应该适用于任何类型的分隔符- 比如“/”,“/”;“等等


使用如下字符串作为
tokenize()
的第二个参数:
'[,;]'
将正则表达式与fn:replace和capturing group一起使用如何

它的优点是使用正则表达式而不是手动标记字符串=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]+)\。-->表示匹配一段时间内的所有字母和空格

将正则表达式与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]+)\。-->意思是匹配所有字母和空格直到一个句点

你的句子中是否从不包含这些字符?(例如,“e.g.”、“i.e.”、“U.s.”@joewiz谢谢你指出这一点……你是对的……现在我必须找出其他提取内容的方法……如果你有任何想法,请告诉我:)在我的回答中添加了一些想法。你的句子中从来没有包含这些字符吗?(例如,“e.g.”、“i.e.”、“U.S.”@joewiz谢谢你指出这一点……你是对的……现在我必须找出其他提取内容的方法……如果你有任何想法,请告诉我:)在我的答案中添加了一些想法。你的第二个表达式生成所有标记,而不仅仅是前三个--
count(.)
始终是1谢谢你,不知道我是如何得到count的,在我的编辑器中仍然有位置…不应该匆忙地写答案,修复了这个问题。拉农,我相信
position()le 3
更短、更高效、更可读。我选择范围表达式是因为它更通用。如果只对从一开始的范围感兴趣,我同意使用le
。Ranon,一个(整数)项和一个连续整数序列之间的一般比较通常效率更低(O(N))而不是
$item ge$seq[1]和$item le$seq[last()]
——后者是O(1)。第二个表达式生成所有标记,而不仅仅是前三个--
计数(.)
总是1谢谢你,不知道我是怎么进入这里的,在我的编辑中仍然有职位…不应该匆忙写答案,修正了这个问题。拉农,我相信
职位()le 3
更短、更高效、更可读。我选择范围表达式是因为它更通用。如果只对从一开始的范围感兴趣,我同意使用le
。Ranon,一个(整数)项和一个连续整数序列之间的一般比较通常效率更低(O(N))而不是
$item ge$seq[1]和$item le$seq[last()]
——后者是O(1)。您也犯了一个小错误-tokenize需要一个正则表达式,因此,
将在每个字符处拆分,因此将返回大量空序列。
将完成此任务。在最后一行中相同,也请参阅我的答案。注意到这一点--已修复。@DimitreNovatchev我如何仅获取第二句和第三句(即不使用前n句或后n句)??谢谢…@Arvind:Use:
tokenize(/div/p,,,;)[position()等式2或position()等式3]
`您也犯了一个小错误-tokenize需要一个正则表达式,所以
将在每个字符处拆分,因此将返回大量空序列。将完成此任务。将完成此任务。在最后一行中也是一样,请参见我的答案。谢谢注意--已修复。@DimitreNovatchev我如何仅获取第二句和第三句(即