2010-03-29 5 views

risposta

22

(?:...) ancora partite, semplicemente non crea un nuovo gruppo a fini di \1/$1/.groups(1)/etc.

+0

Quindi, per ottenere ciò che voglio, dovrei fare a = x.match (/ (ab) (?: cd) (ef) /); x = a [1] + a [2]; corretta? – Murali

+3

@wizard: puoi farlo, sì, ma il gruppo che non cattura non è necessario per quella particolare espressione. '/ (ab) cd (ef) /' farebbe lo stesso lavoro. 'x.replace (/ (ab) cd (ef) /," $ 1 $ 2 ");' lo farebbe ancora meglio, ma immagino che la tua vera espressione sia un po 'più complicata del tuo esempio qui :-). –

5

La tua comprensione è sbagliata. Il gruppo sarà ancora parte dell'acquisizione principale, ma non conterà come acquisizione di sottoespressione. Il seguente restituirebbe un array di due partite:

x = "abcdefg" 
x = x.match(/ab(cd)ef/) 

indice Array 0 sarebbe "ABCDEF" (la corrispondenza completa) e indice di matrice 1 sarebbe "CD", la cattura sub-espressione. Aggiungendo il ?: si dice alla regex di non preoccuparsi di catturare la sottoespressione, la piena corrispondenza è ancora completamente catturata.

Dai tuoi altri commenti, ci sono un certo numero di modi in cui puoi fare ciò che stai cercando di fare. Per esempio:

x.replace(/(ab)cd(ef)/, "$1$2"); 
x.slice(0, x.indexOf("cd")) + x.slice(x.indexOf("cd") + 2); 
0

In aggiunta alle altre risposte, se si ha realmente bisogno per soddisfare solo le espressioni esterne in regex, si dovrebbe fare qualcosa di simile:

x = "abcdefg" 
xarr = x.match(/(ab)(?:cd)(ef)/) 
x = xarr[1] + xarr[2] 

Ma isn davvero regex intendo per questo caso.

+0

Grazie e d'accordo con te, btw, penso che intendessi + invece di & – Murali

+0

Ah, sì, mio ​​male. Troppo VB.Net. – tloflin

Problemi correlati