ฉันจะแยกสตริงย่อยจากภายในสตริงใน Ruby ได้อย่างไร
ตัวอย่าง:
String1 = "<name> <substring>"
ฉันต้องการแยกsubstring
จากString1
(เช่นทุกอย่างภายในเหตุการณ์ล่าสุด<
และ>
)
ฉันจะแยกสตริงย่อยจากภายในสตริงใน Ruby ได้อย่างไร
ตัวอย่าง:
String1 = "<name> <substring>"
ฉันต้องการแยกsubstring
จากString1
(เช่นทุกอย่างภายในเหตุการณ์ล่าสุด<
และ>
)
คำตอบ:
String1.scan(/<([^>]*)>/).last.first
scan
สร้างอาร์เรย์ซึ่งสำหรับแต่ละ<item>
ในString1
ประกอบด้วยข้อความระหว่าง<
และ>
ในอาร์เรย์หนึ่งองค์ประกอบ (เพราะเมื่อใช้กับ regex ที่มีกลุ่มจับสแกนสร้างอาร์เรย์ที่มีการจับภาพสำหรับการแข่งขันแต่ละครั้ง) last
ให้คุณสุดท้ายของอาร์เรย์เหล่าfirst
นั้นแล้วให้สายในนั้น
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
ไม่จำเป็นต้องใช้scan
ถ้าเราต้องการเพียงผลเดียว
ไม่จำเป็นต้องใช้งูใหญ่เมื่อเรามีทับทิมmatch
String[regexp,#]
ดู: http://ruby-doc.org/core/String.html#method-i-5B-5D
บันทึก: str[regexp, capture] → new_str or nil
if we need only one result
โซลูชัน และmatch()[]
ช้าลงเพราะเป็นสองวิธีแทนที่จะเป็นหนึ่งวิธี
string[regex]
สามารถอ่านได้ในสถานการณ์นี้ดังนั้นนั่นคือสิ่งที่ฉันใช้เป็นการส่วนตัว
คุณสามารถใช้การแสดงออกปกติสำหรับที่สวยได้อย่างง่ายดาย ...
การอนุญาตให้มีช่องว่างรอบคำ (แต่ไม่ได้ทำให้พวกเขา):
str.match(/< ?([^>]+) ?>\Z/)[1]
หรือไม่มีช่องว่างที่อนุญาต:
str.match(/<([^>]+)>\Z/)[1]
<>
จริงจะต้องเป็นสิ่งสุดท้ายในสตริง ถ้าเช่นสตริงfoo <bar> baz
อนุญาต (และควรให้ผลลัพธ์bar
) สิ่งนี้จะไม่ทำงาน
นี่เป็นวิธีที่ยืดหยุ่นกว่าเล็กน้อยโดยใช้match
วิธีนี้ ด้วยสิ่งนี้คุณสามารถแยกมากกว่าหนึ่งสตริง:
s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)
# Use 'captures' to get an array of the captures
matchdata.captures # ["ants","pants"]
# Or use raw indices
matchdata[0] # whole regex match: "<ants> <pants>"
matchdata[1] # first capture: "ants"
matchdata[2] # second capture: "pants"
การสแกนที่ง่ายกว่าคือ:
String1.scan(/<(\S+)>/).last