【发布时间】:2015-07-11 15:42:25
【问题描述】:
我正在尝试使用带有正则表达式的 fn:matches 的 XQuery,但 XQuery 的 MarkLogic 实现似乎不允许十六进制字符表示。下面给我一个“无效的正则表达式”错误。
(: Find text containing non-ISO-Latin characters :)
let $regex := '[^\x00-\xFF]'
let $results := fn:collection('mydocs')//myns:myelem[fn:matches(., $regex)]
let $count := fn:count($results)
return
<figures count="{$count}">
{ $results }
</figures>
但是,这个并没有给出错误。
let $regex := '[^a-zA-Z0-9]'
let $results := fn:collection('mydocs')//myns:myelem[fn:matches(., $regex)]
let $count := fn:count($results)
return
<figures count="{$count}">
{ $results }
</figures>
在 MarkLogic 的 XQuery 实现中,有没有一种方法可以使用十六进制字符表示,或者可以得到相同结果的替代方法?
【问题讨论】:
-
你可以试试下面的代码,如果它运行没有错误,请告诉我们:
let $regex := '[^\x00\xFF]'如果它运行,则意味着你的范围有问题。如果它没有运行,那么 MarkLogic 正则表达式将似乎不接受十六进制匹配。 -
谢谢。它确实运行: let $regex := '[^\x00-\xFF]' return $regex does not return an error
-
问题是一个范围内的十六进制字符。当您使用字符集时,每个正则表达式引擎都有不同的转义规则(即有时引擎需要
\[a-z\]其他可能需要[\x{00}]。如果我面前没有实际的 MarkLogic 控制台,将很难测试。 -
你能在 MarkLogic 正则表达式中使用
[[:ascii:]]类吗?在您的第一个示例中,您实际上是在尝试匹配 any ASCII 字符。