2015-10-07 44 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}$"))]