2015-10-07 46 views
3

Im尋找一種方法來否定xquery中的正則表達式。 使用Oracle和XMLQuery函數。XQuery否定正則表達式

我給一個例子第一:

XMLQuery(
    'for $number in ("2a2", "32", "1234", "12", "32a3", "") 
    where ora:matches($number,"^[0-9]{4}$") 

    return xs:integer($number)' 
    passing xml RETURNING CONTENT 
    ) 

這個完美的作品,除了一兩件事。我想得到與模式不匹配的條目完全相反的結果。

我試圖

where fn:not(ora:matches($number,"^[0-9]{4}$")) 
where ora:matches($number,"^[0-9]{4}$") = false() 
where ora:matches($number,"^[0-9]{4}$") = fn:false() 

,所有給我這個

ORA-01722:UngültigeZahl 01722. 00000 - 「無效號碼」 *原因:指定的號碼無效。 *操作:指定一個有效的號碼。

+0

我認爲Oracle正則表達式支持查找變通。試試'^(?![0-9] {4} $)。* $'。 –

+0

不會給我一個錯誤,但都不會返回不匹配的元素(「2a2」,「32」,「12」,「32a3」,「」) – user5334993

+0

您是否指定'return $ number'?您用'xs:integer()'將原始代碼中的值轉換爲整數。 –

回答

0

^[0-9]{4}$的否定可以寫成^[0-9]{0,3}$|^[0-9]{0,3}[^0-9]|^[0-9]{4}.

  • ^[0-9]{0,3}$將匹配數太短。
  • ^[0-9]{0,3}[^0-9]將匹配前四個字符中包含非數字的字符串。
  • ^[0-9]{4}.將匹配以四位數開頭但過長的字符串。
1

只要使用這種純的XPath 2.0表達式(XPath 2.0中是的XQuery的適當子集):

("2a2", "32", "1234", "12", "32a3", "12345", "") 
         [not(matches(., "^[0-9]{4}$"))] 

當此表達式求值(XQuery中,XSLT 2+或任何獨立的XPath/XQuery的翻譯工具),想要的,正確的結果產生

2a2 32 12 32a3 12345 

我們可以進一步簡化這個

("2a2", "32", "1234", "12", "32a3", "12345", "") 
         [not(matches(., "^\d{4}$"))]