ความแตกต่างระหว่าง gsub และวิธีย่อยสำหรับ Ruby Strings คืออะไร


111

ฉันได้อ่านเอกสารสำหรับStringวันนี้และฉันเห็น:subวิธีการซึ่งฉันไม่เคยสังเกตมาก่อน ฉันใช้:gsubและปรากฏว่ามันเหมือนกันเป็นหลัก ใครช่วยอธิบายความแตกต่างให้ฉันได้ไหม ขอบคุณ!


คำตอบ:


209

gย่อมาจากทั่วโลกในขณะที่ทั่วโลกแทนที่ (ทั้งหมด):

ใน irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"

13
ใช่. ฉันเข้าใจแล้ว. ในการป้องกันของฉันฉันไม่คิดว่าสิ่งนี้จะชัดเจนมากนัก ... จนถึงตอนนี้นั่นคือ
Ryanmt

15
ฉันเห็นด้วยกับคุณว่ามันไม่ชัดเจน! Java เรียกสิ่งเหล่านี้replaceและreplaceAll. แต่ Ruby มีรากฐานมาจาก Perl ซึ่งใช้gตัวปรับแต่ง มันเป็นเพียงหนึ่งในสิ่งเหล่านั้น
Ray Toal

1
โชคดีที่ตอนนี้เห็นได้ชัด ฉันจะรู้ในอนาคต
Ryanmt

ยังsubgsub
ไงก็ตาม

ฉันเห็นพฤติกรรมที่แตกต่างไปจากนี้: มี A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" ความคิดว่าทำไมgsub!ดูเหมือนว่าจะค้นหา / แทนที่เฉพาะอินสแตนซ์แรกเมื่อใช้กลุ่ม regex
Bennett Talpers

31

ความแตกต่างคือsubแทนที่การเกิดขึ้นครั้งแรกของรูปแบบที่ระบุเท่านั้นในขณะที่gsubเกิดขึ้นสำหรับเหตุการณ์ทั้งหมด (นั่นคือแทนที่ทั่วโลก)


10
หากคุณตอบก่อนหนึ่งนาทีอาจมีตัวแทนอีก 1020 คนที่เป็นของคุณ :)
Andrew Grimm

3
value = "abc abc"
puts value                                # abc abc
# Sub replaces just the first instance.
value = value.sub("abc", "---")
puts value                                # --- abc
# Gsub replaces all instances.
value = value.gsub("abc", "---")
puts value                                # --- ---

-2

subและgsubทำการแทนที่การแข่งขันครั้งแรกและทั้งหมดตามลำดับ

sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
    fixed = FALSE, useBytes = FALSE)

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
     fixed = FALSE, useBytes = FALSE)


sub("4", "8", "An Introduction to R Software Course will be of 4 weeks duration" )  
##"An Introduction to R Software Course will be of 8 weeks duration"

gsub("4", "8", "An Introduction to R Software Course will be of 4 weeks duration" )
##"An Introduction to R Software Course will be of 8 weeks duration"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.