2010-10-17 16 views
93

Ok la domanda è abbastanza semplice. Sto cercando una stringa come questa:JS Regex, come sostituire solo i gruppi catturati?

name="some_text_0_some_text" 

Ho codice HTML prima e dopo la stringa di cui sopra.

Ora mi piacerebbe sostituire lo 0 con qualcosa del tipo:! NEW_ID!

Così ho fatto una semplice espressione regolare:

.*name="\w+(\d+)\w+".* 

Ma non vedo come sostituire esclusivamente il blocco di catturato.

C'è un modo per sostituire un risultato acquisito come ($ 1) con un'altra stringa?

Il risultato sarebbe:

name="some_text_!NEW_ID!_some_text" 

Grazie per il vostro aiuto :)

+0

Perché stai parsing grezzo HTML con JavaScript? Puoi darci più contesto? – deed02392

risposta

194

Una soluzione è quella di aggiungere cattura per il precedente e seguente testo:

str.replace(/(.*value="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3") 
+19

Saluti dal futuro! La tua soluzione sembra davvero pulita. Potresti spiegare la tua risposta? – Polyducks

+7

Le parentesi sono utilizzate per creare "gruppi", che vengono quindi assegnati a un indice di base 1, accessibile in una sostituzione con un '$', quindi la prima parola '(\ w +)' è in un gruppo e diventa '$ 1 ', la parte centrale' (\ d +) 'è il secondo gruppo, (ma viene ignorato nella sostituzione), e il terzo gruppo è' $ 3'. Quindi, quando si fornisce la stringa di sostituzione di "$ 1! New_ID! $ 3", i $ 1 e $ 3 vengono sostituiti automaticamente con il primo gruppo e il terzo gruppo, consentendo al secondo gruppo di essere sostituito con la nuova stringa, mantenendo il testo che lo circonda . – mix3d

+2

Detto questo, mentre capisco COME funziona, speravo in una soluzione più elegante>. mix3d