2015-05-01 23 views
6

Sto provando un XQuery utilizzando fn:matches con un'espressione regolare, ma l'implementazione MarkLogic di XQuery non sembra consentire la rappresentazione di caratteri esadecimali. Quanto segue mi dà un errore "Espressione regolare non valida".Espressioni regolari in xQuery di 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> 

Tuttavia, questo non dà l'errore.

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'è un modo per utilizzare la rappresentazione esadecimale dei caratteri, o in alternativa che mi avrebbe dato lo stesso risultato, in attuazione di Mark Logic di XQuery?

+0

Puoi provare il seguente codice e farci sapere se funziona senza errori: 'let $ regex: = '[^ \ x00 \ xFF]'' Se viene eseguito, significa che hai un problema con l'intervallo. Se non viene eseguito, la regex di MarkLogic sembrerà non accettare corrispondenze esadecimali. –

+0

Grazie. Effettua effettivamente: let $ regex: = '[^ \ x00- \ xFF]' restituisce $ regex non restituisce un errore – kalinma

+0

Il problema sono i caratteri esadecimali in un intervallo quindi. Ogni motore regex ha regole di escape diverse quando si utilizza un set di caratteri (ad esempio, a volte i motori richiedono '\ [az \]' altri potrebbero aver bisogno di '[\ x {00}]'. Sarà difficile testare senza un vero e proprio La console MarkLogic davanti a me –

risposta

4

XQuery può utilizzare riferimenti a caratteri numerici nelle stringhe, più o meno allo stesso modo in cui XML e HTML può:

decimali: "&#10;" hex: "&#0a;" (o solo "&#a;")

Tuttavia, non è possibile rappresentano alcuni caratteri: <= "&#x09;", ad esempio.

Non c'è alcun tipo di espressione regolare in XQuery (basta usare una stringa come una regex), in modo da poter utilizzare i riferimenti di carattere nelle espressioni regolari:

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

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

Aggiornamento: ecco il XQuery 1.0 spec sul carattere riferimenti: http://www.w3.org/TR/xquery/#dt-character-reference.

Sulla base di alcune brevi test, credo che Mark Logic applica XML norme di riferimento 1.1 caratteri: http://www.w3.org/TR/xml11/#charsets

Ai posteri, ecco le regole XML 1.0: http://www.w3.org/TR/REC-xml/#charsets

+0

Anche questo funziona! – kalinma

1

Bene, sembra che l'implementazione di Mark Logic di XQuery vuole Unicode . Come si è scoperto, anche intervalli molto piccoli in esadecimale (ad esempio, [^x00-x0F]) hanno generato l'errore "Espressione regolare non valida", ma la notazione Unicode non ha generato l'errore. Quanto segue mi dà risultati.

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> 

Penso che la mera assegnazione di let $regex := '[^\x00-\xFF]' non buttare l'errore perché è stata trattata come una stringa quando ho provato return $regex.

+0

Che regex sia non corrisponde ai caratteri unicode per codice esadecimale, ma corrisponde a qualsiasi cosa tranne 'U00',' 0-U' e '00FF' (cioè, tali intervalli sono interpretati come caratteri letterali). – joemfb