2012-03-15 12 views
5

Ho la seguente espressione regolare: (["'])(\\\1|[^\1])+\1È possibile la negazione del gruppo Java RegExp?

Ovviamente non poteva essere compilato perché [^\1] è illeagal.

È possibile negare un gruppo abbinato?

+1

Qual è il testo che si sta cercando di abbinare? La tua espressione regolare è un po 'confusa. – beerbajay

+0

La domanda è, è possibile in altri sapori/lingue? Potrei immaginare che un simile costrutto non abbia senso in quanto un gruppo di cattura può contenere più di un personaggio, quindi '[^ \ 1]' sarebbe un elenco di questi personaggi ... ma questa è solo la mia opinione. Potrebbe anche essere semplicemente che il motore regex deve sapere * in anticipo * quali caratteri aspettarsi. '[\ 1]' funziona? –

+0

L'ho trovato solo su ['regular-expression.info'] (http://www.regular-expressions.info/brackets.html): *" Non è possibile utilizzare i riferimenti differenziali all'interno di una classe di caratteri. in espressioni regolari come '(a) [\ 1b]' sarà interpretato come una fuga ottale nella maggior parte dei regex flavours.Quindi questa regex corrisponderà a 'a' seguito da' \ x01' o a 'b'." * Se voglio avere più informazioni sulle espressioni regolari, suggerisco [* Mastering Regular Expressions * di Jeffrey Friedl] (http://shop.oreilly.com/product/9780596528126.do). –

risposta

4

Non è possibile utilizzare i riferimenti secondari in una classe di caratteri positiva o negativa.

Ma è possibile ottenere ciò che si vuole utilizzare negativo lookahead assertions:

(["'])(?:\\.|(?!\1).)*\1 

Spiegazione:

(["']) # Match and remember a quote. 
(?:  # Either match... 
\\.  # an escaped character 
|   # or 
(?!\1) # (unless that character is identical to the quote character in \1) 
.  # any character 
)*  # any number of times. 
\1  # Match the corresponding quote. 
+0

Hai commentato l'altra domanda che non avrebbe funzionato. Che ne dici di '([" ']) (\\\ 1 |.) +? \ 1'? Non si suppone che l'alternanza sia abbinata da sinistra a destra? O mi sto perdendo il problema qui? Sembra essere ok JavaScript –

+0

@FelixKling: hai ragione: spostando la parentesi sul posto corretto, infatti, risolve il problema.Vediamo se è possibile ripristinare la risposta di Ademiban –

+0

Votato su undelete.La tua soluzione è probabilmente ancora migliore in quanto evita il backtracking –

Problemi correlati