2012-10-25 44 views
2

我有XML元素這樣的序列: <addr>via roma</addr> <addr>via milano</addr> <addr>via napoli</addr> ...正則表達式:計算連續發生的XQuery

,我想檢查是否有地址包含相同地址的連續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()函數,但我不能寫出與此序列匹配的正則表達式。

回答

2

該查詢(和XPath 3.0表達)產生true()恰好當序列$seq包含$ n個或更多具有相同的字符串值連續項:

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 
2

不需要正則表達式。如果$addrsaddr元素的$addrs序列,然後

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) 

給你的元素和指標,其中的三個相等的連續地址子序列開始,在這種情況下(2, <addr>via roma</addr>)

請注意,當長度> 4的子序列存在於$addrs中時,您將獲得重複地址。

1

使用正則表達式模式

<addr>([^<>]*)<\/addr>\s*<addr>\1<\/addr>\s*<addr>\1<\/addr>