XQuery否定正则表达式

时间:2015-10-07 13:37:24

标签: regex oracle xquery

我正在寻找一种在xquery中否定正则表达式的方法。 使用Oracle和XMLQuery函数。

首先举一个例子:

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 - “无效号码” *原因:指定的号码无效。 *操作:指定有效数字。

2 个答案:

答案 0 :(得分:2)

只需使用此纯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}$"))]

答案 1 :(得分: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}.将匹配一个以四位开头的字符串,但太长了。