2015-05-01 21 views
6

Tôi đang thử một XQuery sử dụng fn:matches với biểu thức chính quy, nhưng việc thực hiện MarkLogic của XQuery dường như không cho phép biểu diễn ký tự thập lục phân. Phần sau đây cho tôi một lỗi "biểu thức chính quy không hợp lệ".Các biểu thức chính quy trong xlog của 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> 

Tuy nhiên, điều này không đưa ra lỗi.

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> 

Có cách nào để sử dụng biểu diễn ký tự thập lục phân hay giải pháp thay thế cho tôi kết quả tương tự, trong việc triển khai XQuery của MarkLogic không?

+0

Bạn có thể thử mã sau và cho chúng tôi biết nếu nó chạy không có lỗi: 'let $ regex: = '[^ \ x00 \ xFF]'' Nếu nó chạy, điều đó có nghĩa là bạn gặp sự cố với phạm vi. Nếu nó không chạy, thì regex MarkLogic sẽ xuất hiện để không chấp nhận các kết quả thập lục phân. –

+0

Cảm ơn. Nó thực sự chạy: để $ regex: = '[^ \ x00- \ xFF]' trả lại $ regex không trả lại lỗi – kalinma

+0

Vấn đề là các ký tự hex trong một phạm vi sau đó. Mỗi công cụ regex có các quy tắc thoát khác nhau khi bạn đang sử dụng một bộ ký tự (tức là động cơ đôi khi yêu cầu '\ [az \]' người khác có thể cần '[\ x {00}]'. Bảng điều khiển MarkLogic trước mặt tôi –

Trả lời

4

XQuery có thể sử dụng tài liệu tham khảo nhân vật số trong chuỗi, theo cách tương tự mà XML và HTML có thể:

thập phân: "&#10;" hex: "&#0a;" (hoặc chỉ cần "&#a;")

Tuy nhiên, bạn không thể đại diện cho một số ký tự: <= "&#x09;", chẳng hạn.

Không có loại regex trong XQuery (bạn chỉ cần sử dụng một chuỗi như một regex), vì vậy bạn có thể sử dụng tài liệu tham khảo nhân vật trong biểu thức thông thường của bạn:

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

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

Cập nhật: đây là XQuery 1.0 spec trên nhân vật tài liệu tham khảo: http://www.w3.org/TR/xquery/#dt-character-reference.

Dựa trên một số thử nghiệm ngắn ngủi, tôi nghĩ MarkLogic thực thi XML 1.1 nhân vật quy tắc tham khảo: http://www.w3.org/TR/xml11/#charsets

Đối với hậu thế, đây là những quy tắc XML 1.0: http://www.w3.org/TR/REC-xml/#charsets

+0

Điều đó cũng hoạt động! – kalinma

1

Vâng, có vẻ như việc thực hiện các XQuery MarkLogic của muốn Unicode . Khi nó bật ra, ngay cả các phạm vi rất nhỏ trong hex (ví dụ: [^x00-x0F]) đã ném lỗi "Biểu thức chính quy không hợp lệ", nhưng ký hiệu Unicode không ném lỗi. Sau đây cho tôi kết quả.

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> 

Tôi nghĩ rằng chỉ việc giao let $regex := '[^\x00-\xFF]' không ném lỗi vì nó được coi là một chuỗi khi tôi đã cố gắng return $regex.

+0

không khớp với các ký tự unicode bằng codadoint hệ thập lục phân, nó khớp với bất kỳ thứ gì trừ 'U00',' 0-U' và '00FF' (nghĩa là các phạm vi đó được hiểu là ký tự chữ). – joemfb

Các vấn đề liên quan