2015-05-01 16 views
6

Ich versuche eine XQuery mit fn:matches mit einem regulären Ausdruck, aber die MarkLogic-Implementierung von XQuery scheint Hexadezimale Zeichen Darstellungen nicht zu ermöglichen. Das folgende gibt mir einen "Ungültiger regulärer Ausdruck" Fehler.Reguläre Ausdrücke in MarkLogic xQuery

(: 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> 

Diese gibt jedoch den Fehler nicht.

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> 

Gibt es eine Möglichkeit, die hexadezimale Zeichendarstellung oder eine Alternative zu verwenden, die mir das gleiche Ergebnis in Marklogic-Implementierung von XQuery geben würde?

+0

Können Sie den folgenden Code versuchen und lassen Sie uns wissen, wenn es ohne Fehler läuft: 'let $ regex: = '[^ \ x00 \ xFF]'' Wenn es läuft, bedeutet dies, dass Sie ein Problem mit dem Bereich haben. Wenn es nicht ausgeführt wird, scheint MarkLogic regex hexadezimale Übereinstimmungen nicht zu akzeptieren. –

+0

Danke. Es läuft tatsächlich: Lassen Sie $ Regex: = '[^ \ x00- \ xFF]' zurück $ Regex gibt keinen Fehler – kalinma

+0

Das Problem ist die Hexadezimalzeichen in einem Bereich dann. Jede Regex-Engine hat verschiedene Ausweichregeln, wenn Sie einen Zeichensatz verwenden (dh manche Engines benötigen '\ [az \]' andere brauchen möglicherweise '[\ x {00}]'. Es wird schwierig sein, ohne einen tatsächlichen zu testen Die MarkLogic-Konsole vor mir. –

Antwort

4

XQuery numerischen Zeichenreferenzen in Strings, in der gleichen Weise verwenden können, dass XML und HTML können:

dezimal: "&#10;" hex: "&#0a;" (oder nur "&#a;")

Sie können jedoch nicht repräsentieren einige Zeichen: <= "&#x09;", zum Beispiel.

Es gibt keinen regex Typen in XQuery (Sie nur eine Zeichenfolge als regex verwenden), so dass Sie Zeichenreferenzen in Ihrem regulären Ausdrücken verwenden können:

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

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

aktualisieren: hier sind die XQuery 1.0-Spezifikation auf Zeichen Referenzen: http://www.w3.org/TR/xquery/#dt-character-reference.

Basierend auf einigen kurzen Test, ich denke Marklogic Regeln XML 1.1 Zeichenverweis erzwingt: http://www.w3.org/TR/xml11/#charsets

Für die Nachwelt sind hier die XML 1.0 Regeln: http://www.w3.org/TR/REC-xml/#charsets

+0

Das funktioniert auch! – kalinma

1

Nun, es scheint Umsetzung des Marklogic XQuery will Unicode . Wie sich herausstellte, warfen selbst sehr kleine Bereiche in Hex (z. B. [^x00-x0F]) den Fehler "Ungültiger regulärer Ausdruck", aber die Unicode-Notation warf den Fehler nicht. Das Folgende gibt mir Ergebnisse.

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> 

Ich denke, dass die bloße Zuordnung von let $regex := '[^\x00-\xFF]' nicht den Fehler werfen hat, weil es als String behandelt wurde, als ich return $regex versucht.

+0

Diese Regex ist Unicode-Zeichen entsprechen nicht dem hexadezimalen Codepunkt, es passt alles außer "U00", "0-U" und "00FF" (dh diese Bereiche werden als Literalzeichen interpretiert). – joemfb