2017-02-10 17 views
3

正則表達式的大多數解釋通常似乎表明,預期的行爲是使用從左到右的表達式的貪婪評估。然而,在一個XQuery實現中,我發現交替表達式是並行計算的(顯然是爲了性能),這意味着「第一個」匹配不一定是左邊的匹配的第一個在XSLT/XQuery正則表達式中,是否有評估交替表達式的必要順序?

例如,在每隔一個的XQuery處理器我測試過,給定該輸入:返回

fn:analyze-string( 
    '1-a. x. y. z.', 
    '^(\d+[-\w]*\.?|.{1,10}\.)\s(.+)$', 
    'ix') 

相同的輸出:

<analyze-string-result> 
    <match> 
     <group nr="1">1-a.</group> 
     <group nr="2">x. y. z.</group> 
    </match> 
</analyze-string-result> 

然而,有一個的XQuery處理器(在組1中)評估第一個之前的第二個表達,並且它匹配代替:

<analyze-string-result> 
    <match> 
    <group nr="1">1-a. x. y.</group> 
    <group nr="2">z.</group> 
    </match> 
</analyze-string-result> 

是否有任何XQuery的正則表達式規範的解釋,後者的結果會被認爲是有效的?

+0

最佳做法是避免使用在相同位置匹配的分支。順便說一句,什麼是XQuery處理器使用POSIX處理變化(第二個)的方式? –

+0

@WiktorStribiżew沒有了我不得不處理的輸入很難做到的事情。我可能會被迫將表達方式重構爲更大的表達式,或者將其分成若干階段來強制執行優先級。這在MarkLogic上。 – wst

回答

3

基於https://www.w3.org/TR/xpath-functions-31/#func-analyze-string

如果正則表達式內的若干備選方案都匹配在 在輸入字符串中的相同位置,則該被選擇 匹配是相匹配的第一替代方案。例如,如果輸入 字符串爲The quick brown fox jumps,正則表達式爲 jump|jumps,則選擇的匹配爲jump

我認爲你發佈的第一個結果是正確的,另一個產生第二個結果的處理器有一個錯誤。

+1

第二個結果只是符合POSIX標準的最長分支「獲勝」。 –

+0

許多XSLT和XQuery實現使用現成的正則表達式庫,這常常導致不符合規範的行爲。 –