[英]Regular expression: count consecutive occurrence xquery
我有一個像這樣的 xml 元素序列:
<addr>via roma</addr>
<addr>via milano</addr>
<addr>via napoli</addr>
...
並且我想檢查是否存在包含相同連續地址 3 次或更多次的地址序列,例如:
<addr> via napoli</addr>
<addr>via roma</addr>
<addr>via roma</addr>
<addr>via roma</addr>
<addr>via milano</addr>
....
這個 xml 元素的輸入序列是 xquery 的結果。 我想我應該使用fn:matches()
函數,但我無法編寫與此序列匹配的正則表達式。
當序列$seq
包含 $n 或多個具有相同字符串值的連續項目時,此查詢(和 Xpath 3.0 表達式)會產生true()
:
boolean($seq
[some $i in 1 to count($seq) -($n -1)
satisfies
not(distinct-values(subsequence($seq, $i, $n))[2])
]
)
因此,在這種特定情況下:
let $n := 3,
$seq := /*/addr
return
boolean($seq
[some $i in 1 to count($seq) -($n -1)
satisfies
not(distinct-values(subsequence($seq, $i, $n))[2])
]
)
產生
true
不需要正則表達式。 如果$addrs
是一系列addr
元素,則
for $a at $i in $addrs
let $text := string($a)
where string($addrs[($i + 1)]) eq $text and string($addrs[($i + 2)]) eq $text
return ($i, $a)
為您提供$addrs
中的元素和索引,其中三個相等的連續地址的子序列開始,在這種情況下(2, <addr>via roma</addr>)
。
請注意,當$addrs
存在長度大於 4 的子序列時,您將獲得重復的地址。
使用正則表達式
<addr>([^<>]*)<\/addr>\s*<addr>\1<\/addr>\s*<addr>\1<\/addr>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.