2013-04-05 11 views
13

Was macht das \ 1?Ruby regex was bedeutet das 1 für gsub

Zum Beispiel

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

Ich glaube, es ist etwas mit dem zu tun hat, wie Sie Klammern verwenden, aber ich bin nicht wirklich sicher. Könnte mir das jemand erklären? Und kannst du Sachen wie \ 2 machen? Wenn ja, was würde das tun?

+0

wollen Gruppe (1) ein weiteres Mal wiederholen. Verwenden Sie \ 1 und() repräsentiert die Gruppe – Civa

Antwort

6

Die \1 ist Syntax für die letzte Erfassung in einem regulären Ausdruck mit der () wie Sie sagten. Es sagt, was auch immer gepasst hat, ersetzen Sie es damit.

Sie können fortlaufend () Gruppen und ihre jeweiligen \2 verwenden, um weiterhin zu ersetzen, was Sie gefunden haben.

+0

Können Sie \ 2? Wo/wie würdest du das benutzen? – Tommy

+0

@Tommy Sicher, du musst nur eine andere Gruppe haben. Diese Seite eignet sich hervorragend für Fragen zum regulären Ausdruck: http://www.regular-expressions.info/named.html. – squiguy

+0

ahh hab es, danke – Tommy

20

Jedes Element, das Sie im Suchteil mit runden Klammern umgeben, entspricht einer Zahl \1, \2 usw. im Substitutionsteil.

In Ihrem Beispiel gibt es von Klammern umgeben nur ein Objekt aus, das "(bar)" Artikel, so überall setzen Sie ein \1 ist, wo das Teil in der Klammer wird in getauscht werden. Sie in den \1 mehrfach stellen können, das ist praktisch, wenn Sie das gefundene Element wiederholen möchten, so könnten Sie legal schreiben car\1\1\1 und "bar" werden in drei Mal ausgetauscht.

Es gibt keine Verwendung für \2, da nur ein Element in Klammern eingeschlossen ist. Wenn Sie jedoch (bar)(jar) hätten, würde \1"bar" und \2 darstellen.

könnten Sie auch wie diese Dinge tun:

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

die würde:

barjarbarjarjarbar 

Hier ist ein reales Beispiel, wo dies praktisch ist. Lassen Sie uns sagen Sie so eine Namensliste haben:

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

und Sie wollen es, dies zu ändern: mit

(.+), (.+) 

und ersetzen:

Tom Jones 
Alan Smith 
Dave Smith 
Bud Wilson 

Sie suchen, könnte

\2 \1 

Sie könnten auch w ersetzen ith:

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

Bitte nimm dir die Zeit um deine Antwort besser zu formatieren. Stack Overflow hat [ein nettes Hilfesystem] (http://stackoverflow.com/editing-help), das beschreibt, wie dies zu tun ist. –

+0

Danke für den Link, der geholfen hat. Ich habe es aufgeräumt. –

+0

Sehen Sie sich an, wie ich es formatiert habe, indem Sie auf den Link "editiert" oberhalb meiner Bearbeitungsbenachrichtigung klicken. –

7

Generell \N mit der N-ten Gruppe wird ersetzt im regulären Ausdruck angegeben:

\1: \2 \1 

Welche werden würde. Die erste übereinstimmende Gruppe wird von \1 referenziert und die maximale Anzahl von Gruppen ist 9.

Einige Beispiele:

# 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."