2012-01-24 22 views

risposta

18

risposta generale: Cattura la parte che si desidera mantenere con le parentesi, e comprendono nella stringa di sostituzione come $1.

Per ulteriori dettagli, consultare l'esercitazione di sostituzione di regexp.

Qui: includere solo lo . e lo ( nella stringa di sostituzione.

Per un esercizio, scrivere regexp che trasformerà qualsiasi stringa del regime --ABC--DEF-- a --DEF--ABC-- per lettere valori arbitrari di ABC e DEF. Quindi --XY--IJK-- dovrebbe trasformarsi in --IJK--XY--. Qui hai davvero bisogno di usare i gruppi di cattura e i riferimenti posteriori.

+0

Grazie mille! Ho finalmente capito l'uso delle parentesi e $ nelle sostituzioni ... – lviggiani

3

È possibile utilizzare lookaround asserzioni:

.replace(/(?<=\.)\w+(?=\()/g, 'xxx') 

Coloro permetterà la partita per avere successo, mentre allo stesso tempo non essere parte della partita stessa. Quindi stai sostituendo solo la parte intermedia.

L'opzione più facile per le persone non hanno familiarità con le espressioni regolari è probabilmente al solo includono il . e ( nella sostituzione così:

.replace(/\.\w+\(/g, ".xxx(") 
+2

Tipo di soluzione alternativa per non utilizzare '\ 1', non è vero? Voglio dire, troppe persone non sanno di guardare avanti e guardare indietro, ma spesso sono associate a un costo più alto. In particolare qui, quando sono all'inizio o l'endo della stringa da sostituire comunque. –

+0

Forse. Ci sono due parti da conservare, quindi è necessario essenzialmente '-replace '(\.) \ W + (\()', '$ 1xxx $ 2' (scusate, ricadendo su PowerShell). Sono dubbi che è più leggibile di '-replace '\. \ w + \ (', '.xxx (''. In ogni caso, il lookaround non sarebbe molto più costoso (se non del tutto), e insegnare alle persone nuovi concetti difficilmente può essere considerato sbagliato. – Joey

+0

Sì, mi mancava il fatto che le stringhe siano anche stringhe fisse, quindi è ovviamente più semplice includerle subito, tuttavia, dovrebbe imparare l'uso dei gruppi di cattura, ad esempio per scambiare due valori. –

1

io suggerirei un approccio leggermente diverso:

"myObject.myMethod();".replace(/^([^\.]*\.)\w+(\(.*)$/g, "$1xxx$2"); 

però soluzioni più semplici sono state suggerite.

+0

Beh, questo è quello che ho suggerito anche. I gruppi di cattura sono una caratteristica fondamentale delle espressioni regolari, tutti dovrebbero saperlo –

+0

@ Anony-Mousse: d'accordo, ma sono un po 'confuso riguardo '\ 1' nella tua risposta. IIRC, è solo il modo di fare riferimento a un gruppo all'interno della regex stessa e non alla stringa di sostituzione, che richiede '$ 1'.Per favore correggimi se ho torto su questo. –

+0

Dipende dal dialetto delle espressioni regolari. Immagino che JS usi solo $ 1'. Perl fa entrambe le cose, e sed usa '\ 1' IIRC. –

Problemi correlati