MarkLogic 的 xQuery 中的正则表达式
Regular Expressions in MarkLogic's xQuery
我正在尝试使用 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 实现中,有没有一种方法可以使用十六进制字符表示,或者可以得到相同结果的替代方法?
XQuery 可以在字符串中使用数字字符引用,其方式与 XML 和 HTML 可以:
十进制:" "
十六进制:"�a;"
(或 "&#a;"
)
但是,您无法表示某些字符:例如 <= "	"
。
XQuery 中没有正则表达式类型(您只需将字符串用作正则表达式),因此您可以在正则表达式中使用字符引用:
fn:matches("a", "[^	-ÿ]")
(: => 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
嗯,看来 MarkLogic 的 xQuery 实现需要 Unicode。事实证明,即使是非常小的十六进制范围(例如 [^x00-x0F]
)也会引发 "Invalid regular expression" 错误,但 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
.
时它被视为一个字符串
我正在尝试使用 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 实现中,有没有一种方法可以使用十六进制字符表示,或者可以得到相同结果的替代方法?
XQuery 可以在字符串中使用数字字符引用,其方式与 XML 和 HTML 可以:
十进制:" "
十六进制:"�a;"
(或 "&#a;"
)
但是,您无法表示某些字符:例如 <= "	"
。
XQuery 中没有正则表达式类型(您只需将字符串用作正则表达式),因此您可以在正则表达式中使用字符引用:
fn:matches("a", "[^	-ÿ]")
(: => 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
嗯,看来 MarkLogic 的 xQuery 实现需要 Unicode。事实证明,即使是非常小的十六进制范围(例如 [^x00-x0F]
)也会引发 "Invalid regular expression" 错误,但 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
.