MarkLogic 的 xQuery 中的正则表达式

Posted

技术标签:

【中文标题】MarkLogic 的 xQuery 中的正则表达式【英文标题】:Regular Expressions in MarkLogic's xQuery 【发布时间】: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\] 其他可能需要 [\x00]。如果我面前没有实际的 MarkLogic 控制台,将很难测试。 你能在 MarkLogic 正则表达式中使用[[:ascii:]] 类吗?在您的第一个示例中,您实际上是在尝试匹配 any ASCII 字符。 【参考方案1】:

XQuery 可以在字符串中使用数字字符引用,就像 XML 和 html 一样:

十进制:"&amp;#10;" 十六进制:"&amp;#0a;"(或只是"&amp;#a;"

但是,您不能表示某些字符:例如&lt;= "&amp;#x09;"

XQuery 中没有正则表达式类型(您只需将字符串用作正则表达式),因此您可以在正则表达式中使用字符引用:

fn:matches("a", "[^&#x09;-&#xFF;]")

(: => xs:boolean("false") :)

更新:这是关于字符引用的 XQuery 1.0 规范:http://www.w3.org/TR/xquery/#dt-character-reference。

基于一些简短的测试,我认为 MarkLogic 强制执行 XML 1.1 字符引用规则:http://www.w3.org/TR/xml11/#charsets

为了后代,这里是 XML 1.0 规则:http://www.w3.org/TR/REC-xml/#charsets

【讨论】:

【参考方案2】:

嗯,MarkLogic 的 xQuery 实现似乎需要 Unicode。事实证明,即使是非常小的十六进制范围(例如,[^x00-x0F])也会引发“无效的正则表达式”错误,但 Unicode 表示法不会引发错误。下面给我结果。

let $regex := '[^U0000-U00FF]'
let $results := fn:collection('mydocs')//myns:myelem[fn:matches(., $regex)]
let $count := fn:count($results)

return
    <figures count="$count">
         $results 
    </figures>

我认为仅仅分配let $regex := '[^\x00-\xFF]' 并没有引发错误,因为当我尝试return $regex 时它被视为字符串。

【讨论】:

该正则表达式不匹配十六进制代码点的 unicode 字符;它匹配除U000-U00FF 之外的任何内容(即,这些范围被解释为文字字符)。

以上是关于MarkLogic 的 xQuery 中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Marklogic Json Xquery 无法查询

使用 XQuery 从查询控制台读取 MarkLogic 日志

通过 XCC 将 XQuery xml 元素作为外部变量传递给 Marklogic

在 MarkLogic 中使用 XSLT/XQUERY 进行转换?

我可以在 Marklogic Server 的 xquery 中声明一个全局变量吗?

在不同于使用 XQuery 处理的数据库上进行查询