2014-05-12 116 views
0

我需要一些幫助來分割第N個字符的長字符串。例如Xquery按字符的第N個出現拆分字符串

<string>1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27</string> 

由第九逗號拆分 併成爲

<string>1,2,3,4,5,6,7,8,9</string> 
<string>10,11,12,13,14,15,16,17,18</string> 
<string>19,20,21,22,23,24,25,26,27</string> 

未指定原始字符串的長度和數目1-27的例子可以是帶空格字,但逗號是唯一的分隔符。

謝謝!

回答

3
let $s := <string>1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27</string> 
let $len := 9 
let $tokens := tokenize($s, ',') 
for $n in (1 to count($tokens) idiv $len) 
return <string>{ 
    string-join(subsequence($tokens, $len * ($n - 1) + 1, $len), ',') 
}</string> 
+0

謝謝!它作爲一種魅力:) – user3630062

0

如果你要的XQuery 3.0的訪問,您還可以使用analyze-string(...)使用一些正則表達式富:

let $string := '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27' 
let $result := analyze-string($string, '(?:[^,]+,){8}[^,]+') 
return $result/fn:match 

請實現正則表達式復發的次數少了一個爲數字您想要在之後進行分區的值;它類似於連同逗號的值的數量,以及之後的單值。

如果你還必須處理尾巴,例如。當分割成8個編號的元組的字符串:

let $string := '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27' 
let $result := analyze-string($string, '(?:[^,]+,){7}[^,]+') 
return $result/(fn:match/string(), *[last()]/substring(., 2)) 
+0

謝謝!我無法使用Xquery 3.0,但很高興知道。 – user3630062

1

爲了進一步參考,這裏是使用XQuery 3.0另一種解決方案。它不使用正則表達式,而是使用tumbling window

let $s := '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27' 
for tumbling window $w in tokenize($s, ',') 
    start at $start when true() 
    end at $end when $end - $start eq 8 
return <string>{$w}</string> 

在我看來,這看起來像是windows的模型用例。它的可讀性非常好:使用滾動窗口(與滑動窗口不同,滑動窗口僅在每次循環中順序滑動一個元素,滾動窗口從不重疊),並從序列的開始處開始。如果窗口中有9個元素(即開始和結束之間有8個元素),則結束一個窗口。

相關問題