เรติน่า 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
ลง นี่เป็นวิธีที่รหัสของเราควรประพฤติหรือไม่