MarkLogic&xQuery中的正则表达式

时间:2015-05-01 18:48:45

标签: regex xquery marklogic

我正在尝试使用带有正则表达式的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实现中,有没有办法使用十六进制字符表示或一种可以给我相同结果的替代方法?

2 个答案:

答案 0 :(得分:6)

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

十进制:"&#10;" 十六进制:"&#0a;"(或仅"&#a;"

但是,您无法代表某些字符:例如<= "&#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

答案 1 :(得分:2)

嗯,似乎MarkLogic的xQuery实现需要Unicode。事实证明,即使非常小的十六进制范围(例如,[^x00-x0F])也会抛出&#34;无效的正则表达式&#34;错误,但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时它被视为字符串。