tr และ gsub ต่างกันอย่างไร


133

ผมอ่านเอกสารทับทิมและได้สับสนกับความแตกต่างระหว่างและgsub trอะไรคือความแตกต่างระหว่างทั้งสอง?


8
ฉันพบคำถามนี้เนื่องจาก RuboCop แจ้งเตือนเกี่ยวกับการใช้ gsub ของฉัน - ฉันคิดว่าคำตอบด้านล่างอธิบายคำตอบได้ดีซึ่งโดยพื้นฐานแล้วความแตกต่างระหว่าง gsub และ tr คืออะไร
JohnK

คำตอบ:


180

ใช้trเมื่อคุณต้องการแทนที่ (แปล) อักขระเดี่ยว

trจับคู่กับอักขระเดี่ยว (ไม่ใช่ผ่านนิพจน์ทั่วไป) ดังนั้นอักขระจึงไม่จำเป็นต้องอยู่ในลำดับเดียวกันในอาร์กิวเมนต์สตริงแรก เมื่อพบอักขระจะถูกแทนที่ด้วยอักขระที่พบในดัชนีเดียวกันในอาร์กิวเมนต์สตริงที่สอง:

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

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

ใช้gsubเมื่อคุณต้องการใช้นิพจน์ทั่วไปหรือเมื่อคุณต้องการแทนที่สตริงย่อยที่ยาวขึ้น:

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

'abcde'.gsub(/b.d/, '123')
#=> "a123e"

48
บิตของบริบท: ชื่อtrหมายถึง "แปล" เช่นเดียวกับ "แปลอักขระ" ซึ่งเป็นสิ่งที่ทำ มันตั้งชื่อตามยูทิลิตี้ Unix ที่มีชื่อเดียวกัน (ซึ่งเป็นที่รู้จักกันดีในชื่อที่คลุมเครือและชื่อสั้น ๆ )
Martin Tournoij

40
  • trสามารถแทนที่อักขระเดี่ยวด้วยอักขระคงที่เพียงตัวเดียวเท่านั้น (แม้ว่าคุณจะสามารถจับคู่การเรียงลำดับนี้ได้หลายรายการในการtrโทรครั้งเดียว) แต่ทำได้รวดเร็ว
  • gsubสามารถตรงกับรูปแบบที่ซับซ้อนโดยใช้ regex และแทนที่ด้วยผลการคำนวณที่ซับซ้อน trแต่จะช้ากว่า

9
ถูกต้อง. เมื่อทั้งสองงานมีหลายครั้งที่เร็วกว่าtr gsubนี่คือเกณฑ์มาตรฐานว่าtrจะเร็วกว่าgsubนี้ได้อย่างไร github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu

9

trผลตอบแทนที่ได้สำเนาของstrกับตัวละครในแทนที่ด้วยตัวละครที่เกี่ยวข้องในfrom_str to_strถ้าto_strสั้นกว่าfrom_strนั้นจะถูกเติมด้วยอักขระสุดท้ายเพื่อรักษาการติดต่อกัน http://apidock.com/ruby/String/tr

gsubส่งคืนสำเนาstrที่เกิดขึ้นทั้งหมดของรูปแบบที่ถูกแทนที่สำหรับอาร์กิวเมนต์ที่สอง รูปแบบโดยทั่วไปคือ Regexp; หากกำหนดเป็นสตริงเมตาอักขระของนิพจน์ทั่วไปใด ๆ ที่มีอยู่จะถูกตีความตามตัวอักษรเช่น\dจะจับคู่ฟันเฟืองตามด้วยdแทนตัวเลข http://apidock.com/ruby/String/gsub

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.