2013-05-29 6 views
6

È possibile utilizzare ancore all'interno di una classe di caratteri? Questo non funziona:Ancoraggi Regex all'interno della classe di caratteri

analyze-string('abcd', '[\s^]abcd[\s$]') 

Sembra ^ e $ sono trattati come letterale quando all'interno di una classe di caratteri; tuttavia, sfuggire a loro (\^, \$) non funziona.

Sto cercando di utilizzare questa espressione per creare limiti di parole (\b non è disponibile in XSLT/XQuery), ma preferirei non utilizzare i gruppi ((^|\s)) - poiché i gruppi non di acquisizione non sono disponibili, ciò significa che in alcuni scenari potrei finire con una grande quantità di gruppi di cattura non necessari, e questo crea un nuovo compito di trovare i gruppi di acquisizione "reali" nel set di quelli non necessari.

+0

Chi ha votato per chiuderlo come duplicato, può fornire un collegamento alla presunta domanda duplicata? – LarsH

+0

@LarsH Non ero io, ma questo è il presunto dupe: http://stackoverflow.com/questions/9622869/cvc-pattern-valid-value-a-is-not-facet-valid-with-respect- a-modello-a-za. Anche se ci sono alcuni punti in comune, penso che sia un problema sostanzialmente diverso. – wst

risposta

4

Credo che la risposta è no, non è possibile includere ^ e $ come ancore in un [], solo caratteri letterali. (Avrei desiderato poterlo fare anche prima.)

Tuttavia, è possibile concatenare uno spazio sul fronte e sul retro della stringa, quindi cercare i limiti di parola \s e non preoccuparsi delle ancore. Per esempio.

analyze-string(concat(' ', 'abcd xyz abcd', ' '), '\sabcd\s') 

Si consiglia inoltre + dopo ogni \s, ma questo è una questione separata.

+0

È un trucco, ma lo prenderò! – wst

0

L'utilizzo del segno di omissione dopo la prima parentesi quadra annullerà la classe di caratteri. In sostanza, ti dà l'opposto di quello che stai cercando di fare, cioè la classe del personaggio corrisponderà a qualsiasi personaggio che non è nella classe personaggio. Le classi di caratteri negate corrispondono anche ai caratteri di interruzione di riga (invisibili).

Si potrebbe provare a fare un negativo guardare avanti possibilmente.

(?!\s) 
+0

Sfortunatamente, look-ahead/behind non sono inclusi nella regex nelle specifiche XQuery e XSLT. Ho aggiornato la regex per essere più chiara - in realtà intendevo includere l'ancora nella classe di caratteri. L'obiettivo è di richiedere lo "spazio OR iniziale/fine-ancora (senza catturare)" corrispondente. – wst

2

Se si utilizza analyze-string come una funzione, presumibilmente si sta utilizzando un'implementazione 3.0 di XSLT o XQuery.

In tal caso, perché si dice "i gruppi non catturanti non sono disponibili"? Il XPath Functions and Operators 3.0 spec è esplicito che vengono riconosciuti anche i gruppi non acquisiti, che sono indicati dalla sintassi (?: Xxxx). "

+0

Sto usando MarkLogic, che ha implementato solo un sottoinsieme di 3.0. – wst

Problemi correlati