เรติน่า 7 ไบต์
!rm`.*$
ด้วย regex เพียงครั้งเดียว Retina ทำงานในโหมดจับคู่ โดยปกติแล้วจะพิมพ์จำนวนการแข่งขัน แต่ด้วย!การกำหนดค่าให้เราพิมพ์การแข่งขันที่แท้จริงแทน (คั่นด้วย linefeeds)
regex .*$ที่เกิดขึ้นจริงเป็นเพียง .*ตรงกับบรรทัดใด ๆ (อาจว่างเปล่า) เนื่องจาก.สามารถจับคู่อักขระใด ๆ ยกเว้น linefeeds ฉันจะไป$ในนาทีเดียว
เราจะทำให้มันพิมพ์การแข่งขันในสิ่งที่ตรงกันข้ามได้อย่างไร โดยการใช้โหมดการจับคู่ .NET rขวาไปซ้ายเปิดใช้งานด้วย ซึ่งหมายความว่าเอ็นจิ้น regex เริ่มต้นที่ส่วนท้ายของสตริงเมื่อค้นหารายการที่ตรงกัน
ในที่สุดการmทำให้$ตรงกับจุดสิ้นสุดของบรรทัดแทนส่วนท้ายของสตริง ทำไมเราถึงต้องใช้มัน? ปัญหาคือการ.*สร้างการแข่งขันที่ไม่เกี่ยวข้อง พิจารณาการทดแทน regex
s/a*/$0x/
baaababaaนำไปใช้ในการป้อนข้อมูล คุณจะคิดว่านี้จะให้ผลผลิตbaaaxbaxbaaxแต่จริง ๆ baaaxxbaxxbaaxxแล้วมันจะช่วยให้คุณ ทำไม? เพราะหลังจากที่ตรงกับaaaเคอร์เซอร์ของเครื่องยนต์อยู่ระหว่างและa bตอนนี้มันไม่สามารถจับคู่อีกaต่อไป แต่a*ก็ยังพอใจกับสตริงที่ว่างเปล่า ซึ่งหมายความว่าหลังจากทุกการแข่งขันคุณจะได้รับการจับคู่ที่ว่างเปล่าอีกครั้ง
เราไม่ต้องการที่นี่เพราะมันจะแนะนำบรรทัดว่างเพิ่มเติมดังนั้นเราจึงยกเลิกการจับคู่ที่ไม่เกี่ยวข้อง (ซึ่งเป็นจุดเริ่มต้นของบรรทัดเนื่องจากโหมดจากขวาไปซ้าย) โดยกำหนดให้การจับคู่นั้นรวมถึงจุดสิ้นสุดของ เส้น.
tacค่อนข้างแปลกเมื่อพูดถึงการป้อนบรรทัดฟีด มันแปลงa\nb\n(ลากเลื่อนบรรทัด) ลงb\na\nและa\nb(ไม่มีการเลื่อนบรรทัดต่อท้าย)ba\nลง นี่เป็นวิธีที่รหัสของเราควรประพฤติหรือไม่