ฉันจะลบสตริง“ \ n” จากภายในสตริง Ruby ได้อย่างไร


115

ฉันมีสตริงนี้:

"some text\nandsomemore"

ฉันต้องการลบ "\ n" ออกจากมัน ฉันพยายามแล้ว

"some text\nandsomemore".gsub('\n','')

แต่มันไม่ได้ผล ฉันต้องทำอย่างไร? ขอบคุณที่อ่าน.

คำตอบ:


172

คุณจำเป็นต้องใช้"\n"ไม่ได้'\n'ใน gsub ของคุณ เครื่องหมายคำพูดที่แตกต่างกันทำงานแตกต่างกัน

เครื่องหมายคำพูดคู่"อนุญาตให้ขยายอักขระและการแก้ไขนิพจน์เช่น พวกเขาให้คุณใช้อักขระควบคุมที่ใช้ Escape \nเพื่อแทนค่าที่แท้จริงของพวกเขาในกรณีนี้ขึ้นบรรทัดใหม่และอนุญาตให้ใช้#{expression}เพื่อให้คุณสามารถสานตัวแปรและนิพจน์ทับทิมที่คุณชอบลงในข้อความได้ดีทีเดียว

ในทางกลับกันเครื่องหมายคำพูดเดี่ยวจะ'ปฏิบัติต่อสตริงอย่างแท้จริงดังนั้นจึงไม่มีการขยายการแทนที่การแก้ไขหรือสิ่งที่คุณมี

เฉพาะในกรณีนี้มันจะดีกว่าที่จะใช้อย่างใดอย่างหนึ่ง.deleteหรือ.trวิธี String ลบบรรทัดใหม่

ดูข้อมูลเพิ่มเติมได้ที่นี่


17
ไวยากรณ์ที่เหมาะสมจะเป็น. gsub (/ \ n /, "")
boulder_ruby

2
@ เดวิดถูกต้อง อย่างไรก็ตามฉันรู้สึกว่าเป็นเรื่องสำคัญที่จะต้องแสดงให้เห็นว่าคำพูดนั้นสร้างความแตกต่างเนื่องจากจะเป็นประโยชน์ต่อเบ็นในตอนนี้ โปรดทราบว่าเดวิดอาจเป็นเรื่องของสไตล์มากกว่า "ถูกต้อง" โดยส่วนตัวแล้วฉันคิดว่าtrเป็นทางเลือกที่ดีกว่าสำหรับงานนี้ แต่อย่างที่ฉันพูดฉันคิดว่ามันจะดีกว่าที่จะชี้ให้เห็นความแตกต่างของเครื่องหมายคำพูดเดี่ยวและคู่เมื่อฉันตอบ
ocodo

60

เมื่อคุณต้องการลบสตริงแทนที่จะแทนที่คุณสามารถใช้String#delete(หรือสิ่งที่เทียบเท่ามิวเตเตอร์String#delete!) เช่น:

x = "foo\nfoo"
x.delete!("\n")

x ตอนนี้เท่ากับ "foofoo"

ในกรณีเฉพาะนี้String#deleteสามารถอ่านได้มากกว่าgsubเนื่องจากคุณไม่ได้แทนที่สตริงด้วยอะไรเลย


3
อย่างน้อยใน Ruby 1.9.3 deleteจะไม่ทำลายล้างตามที่ระบุไว้ที่นี่ ส่งคืนสตริงใหม่
Brent Dillingham

เห็นดี ฉันได้อัปเดตข้อมูลโค้ดนั้นเพื่อใช้เวอร์ชัน mutator String # delete! แทนที่จะเป็น String # delete
Paul Leader

56

หากคุณต้องการหรือไม่สนใจที่จะนำช่องว่างที่นำหน้าและต่อท้ายออกจากสตริงของคุณคุณสามารถใช้stripวิธีนี้ได้

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

เป็นที่กล่าวถึงที่นี่

แก้ไขชื่อเดิมของคำถามนี้แตกต่างกัน คำตอบของฉันคือคำถามเดิม


2
สิ่งนี้ไม่ตอบคำถาม stripลบเฉพาะช่องว่างที่นำหน้าและต่อท้าย: ruby-doc.org/core-1.9.3/String.html#method-i-strip-21
thelostspore

1
@mvdanj ใช่เมื่อให้รายละเอียดของคำถามนี้มันไม่ได้คำตอบ แต่จะตอบคำถามตามชื่อเรื่อง ฉันสงสัยว่านั่นคือเหตุผลที่ผู้คนพบว่ามันมีประโยชน์
ThomasW

ชื่อเรื่องเปลี่ยนไปจากตอนที่ฉันตอบตอนแรก
ThomasW

29

คุณไม่จำเป็นต้องมีนิพจน์ทั่วไปสำหรับสิ่งนี้ ใช้ tr:

"some text\nandsomemore".tr("\n","")

tr an replace ต่างกันอย่างไร
Arnold Roa

replaceเพียงแค่เปลี่ยนสตริงเป็นสตริงใหม่เช่นการกำหนดตัวแปร ในขณะที่trเป็นการค้นหาและแทนที่โกลบอลแบบอักขระโดยอักขระ
Mark Thomas

21

ใช้chompหรือstripฟังก์ชั่นจาก Ruby:

"abcd\n".chomp => "abcd"
"abcd\n".strip => "abcd"

2
สิ่งนี้ไม่ตอบคำถาม stripลบเฉพาะช่องว่างที่นำหน้าและต่อท้าย - ruby-doc.org/core-1.9.3/String.html#method-i-strip-21
thelostspore

2
chomp เป็นวิธีที่ดีที่สุด ... ไม่น่าเชื่อว่าจะมีการ
โหวตเพิ่ม

ในวิธีการ chomp \ n และ \ r จะถูกลบออกจากจุดสิ้นสุดของ str หากมีอยู่ไม่ใช่ตรงกลาง ดังนั้นจึงไม่สามารถแก้คำถาม OP
silva96

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