แทนที่คำในสตริง - Ruby


281

ฉันมีสตริงใน Ruby:

sentence = "My name is Robert"

ฉันจะแทนที่คำใดคำหนึ่งในประโยคนี้ได้อย่างง่ายดายโดยไม่ต้องใช้โค้ดที่ซับซ้อนหรือวนซ้ำ


แทนที่ด้วยวิธีใด? แทนที่คำที่กำหนดเอง (คำ # 2) หรือคำที่เฉพาะเจาะจง ( my)?
Blender

ขอบคุณสำหรับคำถามสั้น ๆ ง่ายๆและมีประโยชน์ มันช่วยให้ฉันออกไปหาวิธีแก้ไขแฮชแท็กในมุมมองของฉัน
Stef Hej

คำตอบ:


494
sentence.sub! 'Robert', 'Joe'

จะไม่ทำให้เกิดข้อยกเว้นถ้าคำที่ถูกแทนที่ไม่อยู่ในประโยค ( []=ตัวแปรจะ)

จะแทนที่ทุกกรณีได้อย่างไร

ข้างต้นแทนที่อินสแตนซ์แรกของ "Robert" เท่านั้น

ในการแทนที่อินสแตนซ์ทั้งหมดให้ใช้gsub/ gsub!(เช่น "การทดแทนทั่วโลก"):

sentence.gsub! 'Robert', 'Joe'

ด้านบนจะแทนที่ทุกกรณีของ Robert ด้วย Joe


ดูเหมือนว่าจะแทนที่เฉพาะอินสแตนซ์แรกซึ่งแน่นอนว่าบางครั้งก็ใช้ได้
Jason Swett

@JasonSwett อัปเดตคำตอบเพื่อให้ครอบคลุมถึงวิธีการแทนที่อินสแตนซ์ทั้งหมด
srcspider

128

หากคุณกำลังจัดการกับข้อความภาษาธรรมชาติและต้องการแทนที่คำไม่ใช่เพียงส่วนหนึ่งของสตริงคุณต้องเพิ่มการแสดงออกปกติใน gsub ของคุณเนื่องจากการแทนที่ข้อความธรรมดาอาจทำให้เกิดผลร้าย:

'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"

การแสดงออกปกติมีขอบเขตของคำเช่น\bที่ตรงกับจุดเริ่มต้นหรือจุดสิ้นสุดของคำ ดังนั้น

'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"

ใน Ruby ซึ่งแตกต่างจากภาษาอื่น ๆ เช่น Javascript ขอบเขตของคำนั้นเข้ากันได้กับ UTF-8 ดังนั้นคุณสามารถใช้มันสำหรับภาษาที่ไม่มีตัวอักษรละตินหรือละตินที่ขยายออก:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"

6
โปรดทราบว่าบางภาษาไม่ได้ใช้ช่องว่างดังนั้นจึง\bไม่ทำงานในภาษาเหล่านั้นคุณจะต้องใช้การวิเคราะห์รูปร่างหรือสิ่งต่าง ๆ เช่นนั้นในกรณีเหล่านั้น นอกจากนี้ +1 สำหรับตัวอย่างที่เฮฮา
NiñoScript

57

คุณสามารถลองใช้วิธีนี้:

sentence ["Robert"] = "Roger"

จากนั้นประโยคจะกลายเป็น:

sentence = "My name is Roger" # Robert is replaced with Roger

4
มันค่อนข้างน่าสนใจ ฉันไม่เคยเห็นวิธีการทดแทนนี้มาก่อน
Sean Hill

6
คุณจะไม่ได้รับข้อผิดพลาดด้วยวิธีนี้หากสตริงเดิมไม่มีคำที่คุณพยายามแทนที่
srcspider

2
เพียงให้แน่ใจว่า resuce IndexErrorบน มิฉะนั้นคำที่ไม่เป็นส่วนหนึ่งของประโยคจะนำไปสู่:string not matched (IndexError)
Konrad Reiche

9
ปัญหาอีกประการหนึ่งของวิธีนี้คือแทนที่อินสแตนซ์แรกของสตริงเท่านั้น
Martin Konecny

14
สิ่งนี้น่าสนใจ แต่ไม่ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องแน่นอน
Niels Abildgaard

46

stringครั้งแรกที่คุณไม่ได้ประกาศชนิดในรูบีดังนั้นคุณจึงไม่จำเป็นต้องเป็นคนแรก

sentence.gsub(/match/, "replacement")เพื่อแทนที่คำในสตริงที่คุณทำ:

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