我正在寻找一种在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 - “无效号码” *原因:指定的号码无效。 *操作:指定有效数字。
答案 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}.
将匹配一个以四位开头的字符串,但太长了。