2013-04-05 17 views
13

Cosa fa \ 1?Ruby regex cosa significa 1 per gsub

Per esempio

"foo bar bag".gsub(/(bar)/,'car\1') 

credo che abbia qualcosa a che fare con il modo di utilizzare parentesi, ma non sono davvero sicuro. Qualcuno potrebbe spiegarmelo? E puoi fare cose come \ 2? Se sì, cosa farebbe?

+0

vogliono ripetere gruppo (1) un altro momento. usa \ 1 e() rappresenta il gruppo – Civa

risposta

6

Lo \1 è la sintassi per l'ultima acquisizione in un'espressione regolare che utilizza lo () come hai detto tu. Dice tutto ciò che è stato abbinato, sostituirlo con quello.

È possibile continuare a utilizzare i gruppi () e i rispettivi \2 per continuare a sostituire ciò che si è abbinato.

+0

Puoi farlo \ 2? Dove/come lo useresti? – Tommy

+0

@Tommy Certo, devi solo avere un altro gruppo. Questo sito è eccellente per le domande sulle espressioni regolari: http://www.regular-expressions.info/named.html. – squiguy

+0

ahh capito, grazie – Tommy

20

Ogni elemento che si circonda con parentesi nella parte di ricerca corrisponderà a un numero \1, \2, ecc., Nella parte di sostituzione.

Nel tuo esempio, non c'è un solo elemento circondato da parentesi, la voce "(bar)", in modo da nessuna parte si mette un \1 è dove la parte all'interno delle parentesi, verrà scambiato in. Puoi mettere nel \1 più volte, che è utile se si desidera ripetere l'elemento trovato, in modo da poter scrivere in modo legittimo car\1\1\1 e "bar" verrà scambiato in tre volte.

Non c'è niente per \2 perché c'è solo un elemento circondato da parentesi. Tuttavia, se si disponesse di (bar)(jar), il \1 rappresenterebbe "bar" e \2 rappresenterebbe "jar".

Si potrebbe anche fare cose come questa:

\1\2\1\2\2\1 

che sarebbe diventato:

barjarbarjarjarbar 

Ecco un esempio del mondo reale in cui questo viene in aiuto. Diciamo che si dispone di un elenco di nomi come questo:

Jones, Tom 
Smith, Alan 
Smith, Dave 
Wilson, Bud 

e si desidera cambiarlo a questo:

Tom Jones 
Alan Smith 
Dave Smith 
Bud Wilson 

Si potrebbe cercare:

(.+), (.+) 

e sostituirlo con:

\2 \1 

Si potrebbe anche sostituire w esimo:

\1: \2 \1 

che sarebbe diventato:

Jones: Tom Jones 
Smith: Alan Smith 
Smith: Dave Smith 
Wilson: Bud Wilson 
+3

Si prega di prendere il tempo per formattare meglio la risposta. Stack Overflow ha [un bel sistema di aiuto] (http://stackoverflow.com/editing-help) che descrive come farlo. –

+0

Grazie per il collegamento, che ha aiutato. L'ho ripulito. –

+0

Dai un'occhiata a come ho formattato facendo clic sul link "modificato" sopra la mia notifica di modifica. –

7

generale \N viene sostituito con il gruppo N-esimo specificato nell'espressione regolare. Il primo gruppo abbinato è referenziato da \1 e il numero massimo di gruppi è 9.

Alcuni esempi:

# wrap every integer into brackets 
'1 2 34'.gsub(/(\d+)/, '[\1]') 
# => "[1] [2] [34]" 

# gsub with two groups: swap couples of integers 
'<1,2> <3,4>'.gsub(/(\d+),(\d+)/, '\2,\1') 
# => "<2,1> <4,3>" 

# you can reference the same group more than once 
'1 2 34'.gsub(/(\d+)/, '<\1,\1>') 
# => "<1,1> <2,2> <34,34>" 

# a slightly more complex example 
'Jim Morrison'.sub(/([A-Z])[a-z]+ ([A-Z][a-z]+)/, '\2 \1.') 
# => "Morrison J."