簡體   English   中英

正則表達式:計數連續出現 xquery

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM