Was ist der Unterschied zwischen tr und gsub?

133

Ich habe die Ruby-Dokumentation gelesen und war verwirrt über den Unterschied zwischen gsubund tr. Was ist der Unterschied zwischen den beiden?

der Blechmann
quelle
8
Ich habe diese Frage gefunden, weil RuboCop auf meine Verwendung von gsub aufmerksam gemacht hat. Ich denke, die folgenden Antworten erklären die Antwort gut, was im Grunde den Unterschied zwischen gsub und tr ausmacht.
JohnK

Antworten:

180

Verwenden trSie diese Option, wenn Sie einzelne Zeichen ersetzen (übersetzen) möchten.

trÜbereinstimmungen mit einzelnen Zeichen (nicht über einen regulären Ausdruck), daher müssen die Zeichen im ersten Zeichenfolgenargument nicht in derselben Reihenfolge vorkommen. Wenn ein Zeichen gefunden wird, wird es durch das Zeichen ersetzt, das im zweiten Zeichenfolgenargument am selben Index gefunden wird:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"

Verwenden gsubSie diese Option, wenn Sie einen regulären Ausdruck verwenden müssen oder wenn Sie längere Teilzeichenfolgen ersetzen möchten:

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"
Spickermann
quelle
48
Ein bisschen Kontext: Der Name trbedeutet "übersetzen", wie in "Zeichen übersetzen", was genau das ist, was er tut. Es ist nach dem gleichnamigen Unix-Dienstprogramm benannt (das für seine obskuren und kurzen Namen bekannt ist).
Martin Tournoij
40
  • trkann nur ein einzelnes Zeichen durch ein einzelnes festes Zeichen ersetzen (obwohl Sie mehrere Übereinstimmungen dieser Art in einem einzigen trAufruf platzieren können), ist aber schnell.
  • gsubkann komplizierte Muster mit Regex abgleichen und durch ein kompliziertes Berechnungsergebnis ersetzen, ist aber langsamer als tr.
sawa
quelle
9
Das stimmt. Wenn beide Arbeiten trmehrmals schneller sind als gsub. Hier ist ein Benchmark, wie schnell als sein trkönnte gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
9

trGibt eine Kopie von zurück, strwobei die Zeichen in from_strdurch die entsprechenden Zeichen in ersetzt werden to_str. Wenn to_stres kürzer als ist from_str, wird es mit seinem letzten Zeichen aufgefüllt, um die Entsprechung aufrechtzuerhalten. http://apidock.com/ruby/String/tr

gsubGibt eine Kopie von zurück, strwobei alle Vorkommen von Mustern das zweite Argument ersetzen. Das Muster ist normalerweise ein Regexp; Wenn es als Zeichenfolge angegeben wird, werden alle darin enthaltenen Metazeichen für reguläre Ausdrücke wörtlich interpretiert, z. B. \dstimmen sie mit einem Spiel überein, gefolgt von deiner Ziffer. http://apidock.com/ruby/String/gsub

Joel
quelle