Regex XQuery否定正则表达式

Regex XQuery否定正则表达式,regex,oracle,xquery,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 ) 除了一件事之

我正在寻找一种在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ültige Zahl 172200000-“无效号码” *原因:指定的数字无效。
*操作:指定一个有效的数字。

^[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}。
    将匹配以四位数字开头的字符串,但太长

只需使用这个纯XPath 2.0表达式即可(XPath 2.0是XQuery的适当子集):

对该表达式求值时(在XQuery、XSLT 2+或任何独立的XPath/XQuery解释器工具中),生成所需的正确结果

2a2 32 12 32a3 12345
("2a2", "32", "1234", "12", "32a3", "12345", "")
                      [not(matches(., "^\d{4}$"))]
可以进一步简化这一点

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

我认为Oracle正则表达式支持环顾四周。Try
^(?[0-9]{4}$).*$
不会给我错误,但也不会返回不匹配的元素(“2a2”、“32”、“12”、“32a3”和“”)。是否指定了
返回$number
?您使用
xs:integer()
在原始代码中将值强制转换为整数。不,它应该被视为函数ora:matches的字符串作为参数()。返回之前的强制转换只是为了显示它,而不是像“7682124953876”那样的大字符串。通过求反,过滤所有数字,并尝试强制转换非数字。我认为这是预期的行为。