แยกสตริงออกเป็นชิ้น ๆ ที่มีความยาวเท่ากัน n
ในภาษา "ปกติ" ส่วนใหญ่ TMTOWTDI (มีมากกว่าหนึ่งวิธีในการทำ) ฉันสมมติว่าที่นี่อินพุตไม่ประกอบด้วย linefeeds และ "การแยก" หมายถึงการแยกมันออกเป็นเส้น แต่มีเป้าหมายที่แตกต่างกันสองประการ: ถ้าความยาวของสตริงไม่ใช่ความยาวหลายอันคุณต้องการเก็บอันต่อท้ายที่ไม่สมบูรณ์หรือคุณต้องการทิ้งมันหรือไม่?
การรักษาส่วนต่อท้ายที่ไม่สมบูรณ์
โดยทั่วไปมีสามวิธีในการแยกใน Retina ฉันกำลังนำเสนอวิธีการทั้งสามที่นี่เพราะพวกเขาอาจสร้างความแตกต่างที่ใหญ่กว่าเมื่อคุณพยายามที่จะปรับให้เข้ากับปัญหาที่เกี่ยวข้อง คุณสามารถใช้การแทนที่และผนวก linefeed เข้ากับการแข่งขันแต่ละรายการ:
.{n}
$&¶
นั่นเป็น 8 ไบต์ (หรือน้อยไปนิดถ้าn = 2
หรือn = 3
แล้วเพราะคุณสามารถใช้..
หรือ...
ตามลำดับ) นี่เป็นปัญหาหนึ่ง: มันผนวก linefeed เพิ่มเติมหากความยาวสตริงเป็นความยาวหลายอัน
คุณยังสามารถใช้สเตจแยกและใช้ประโยชน์จากข้อเท็จจริงที่ว่าการดักจับเก็บไว้ในสปลิต:
S_`(.{n})
_
ตัวเลือกเอาบรรทัดว่างที่อาจจะเกิดขึ้นจากการที่ครอบคลุมสตริงทั้งหมดที่มีการแข่งขัน นี่คือ 9 ไบต์ แต่ไม่ได้เพิ่ม linefeed ต่อท้าย สำหรับn = 3
มัน 8 ไบต์และn = 2
มัน 7 ไบต์ โปรดทราบว่าคุณสามารถบันทึกหนึ่งไบต์โดยรวมถ้าบรรทัดว่างเปล่าไม่ได้เรื่อง (เช่นเพราะคุณจะได้รับการประมวลผลสายไม่ว่างเปล่าและการกำจัด linefeeds ในภายหลังต่อไป) _
แล้วคุณสามารถเอา
ตัวเลือกที่สามคือการใช้การแข่งขัน ด้วย!
ตัวเลือกที่เราสามารถพิมพ์การแข่งขันทั้งหมด อย่างไรก็ตามหากต้องการรวมส่วนต่อท้ายเราจำเป็นต้องอนุญาตให้มีความยาวการจับคู่ตัวแปร:
M!`.{1,n}
นี่คือ 9 ไบต์และจะไม่รวมการป้อนบรรทัดต่อท้าย นี้ก็จะกลายเป็น 8 ไบต์โดยการทำn = 3
..?.?
อย่างไรก็ตามทราบว่าลดไป6ไบต์เพราะตอนนี้เราจะต้องn = 2
..?
นอกจากนี้โปรดทราบว่าM
สามารถลดลงได้หากนี่เป็นขั้นตอนสุดท้ายในโปรแกรมของคุณโดยบันทึกหนึ่งไบต์ในทุกกรณี
ทิ้งชิ้นส่วนต่อท้ายที่ไม่สมบูรณ์
สิ่งนี้จะใช้เวลานานมากถ้าคุณพยายามที่จะแทนที่ด้วยเพราะคุณต้องเปลี่ยนชิ้นส่วนต่อท้ายด้วยไม่มีอะไร (ถ้ามี) และแบ่งด้วย ดังนั้นเราสามารถเพิกเฉยได้อย่างปลอดภัย ที่น่าสนใจสำหรับวิธีการจับคู่มันตรงกันข้าม: มันสั้นลง:
M!`.{n}
นั่นเป็น 7 ไบต์หรือน้อยกว่าสำหรับ,n = 2
n = 3
อีกครั้งโปรดทราบว่าคุณสามารถละเว้นM
ถ้านี่คือขั้นตอนสุดท้ายในรหัส
หากคุณต้องการให้ป้อนบรรทัดต่อท้ายที่นี่คุณสามารถรับได้โดยผนวก|$
เข้ากับ regex
โบนัส: ชิ้นส่วนที่ทับซ้อนกัน
โปรดจำไว้ว่าM
มี&
ตัวเลือกที่ส่งคืนการจับคู่ที่ซ้อนทับกัน (ซึ่งโดยทั่วไปจะไม่สามารถใช้ regex ได้) สิ่งนี้ช่วยให้คุณได้รับชิ้นส่วนที่ทับซ้อนกันทั้งหมด (สตริงย่อย) ของสตริงที่มีความยาวที่กำหนด:
M!&`.{n}