ทำความเข้าใจการทำงานของอักขระ "$" ในนิพจน์ทั่วไปของ Python
- เมื่อใช้โมดูล
re ของ Python โดยทั่วไปเข้าใจกันว่า ^ หมายถึง "จุดเริ่มต้นของสตริง" และ $ หมายถึง "จุดสิ้นสุดของสตริง"
- อย่างไรก็ตาม
$ ไม่ได้หมายถึงเพียง "จุดสิ้นสุดของสตริง" เสมอไป และการทำงานอาจแตกต่างกันไปตามแพลตฟอร์ม
- ใน Python เมื่อไม่ได้เปิดโหมดหลายบรรทัด
$ สามารถจับคู่กับจุดสิ้นสุดของสตริง หรือก่อนอักขระขึ้นบรรทัดใหม่ที่ท้ายสตริงได้
ความแตกต่างระหว่างการจับคู่จุดสิ้นสุดของสตริงกับอักขระขึ้นบรรทัดใหม่
- เมื่อปิดโหมดหลายบรรทัด ใน Python หากต้องการจับคู่กับจุดสิ้นสุดของสตริงโดยไม่มีอักขระขึ้นบรรทัดใหม่ ไม่ควรใช้เพียง
$ เท่านั้น
- สามารถใช้
\z และ \Z เพื่อจับคู่กับจุดสิ้นสุดของสตริงได้
- ใน Python เมื่อใช้
re.MULTILINE แล้ว $ จะจับคู่ทั้งกับจุดสิ้นสุดของสตริงและจุดสิ้นสุดของแต่ละบรรทัด (ก่อนอักขระขึ้นบรรทัดใหม่ทันที)
เปรียบเทียบการทำงานของนิพจน์ทั่วไปบนแพลตฟอร์มต่าง ๆ
- จากตารางที่เปรียบเทียบว่ารูปแบบตรงกับ
cat\n หรือไม่ในหลายแพลตฟอร์ม จะเห็นได้ว่าหากอนุญาตให้จับคู่โดยรวมอักขระขึ้นบรรทัดใหม่ด้วย การใช้ $ ในโหมดหลายบรรทัดจะให้พฤติกรรมที่สอดคล้องกัน
- หากต้องการจับคู่โดยไม่รวมอักขระขึ้นบรรทัดใหม่ ทุกแพลตฟอร์มยกเว้น Python และ ECMAScript ควรใช้
\z ส่วนใน Python และ ECMAScript ควรใช้ \Z หรือใช้ $ โดยไม่เปิดโหมดหลายบรรทัดตามลำดับ
ความเห็นของ GN⁺
- บทความนี้ช่วยเตือนนักพัฒนาที่ใช้นิพจน์ทั่วไปให้ระวังพฤติกรรมที่คาดไม่ถึงของอักขระ
$ ใน Python
- นิพจน์ทั่วไปเป็นเครื่องมือทรงพลังมากสำหรับการประมวลผลสตริง แต่ก็ควรระวังเพราะพฤติกรรมอาจต่างกันในแต่ละแพลตฟอร์ม
- นักพัฒนาควรตระหนักถึงความแตกต่างเหล่านี้ และอาจต้องทดสอบเพิ่มเติมเพื่อหลีกเลี่ยงปัญหาความเข้ากันได้เมื่อพัฒนาแอปพลิเคชันข้ามแพลตฟอร์ม
- ไลบรารีนิพจน์ทั่วไปอื่นที่มีความสามารถคล้ายกัน เช่น
java.util.regex ของ Java และ System.Text.RegularExpressions ของ .NET ก็จำเป็นต้องทำความเข้าใจความแตกต่างของพฤติกรรมตามแพลตฟอร์มของตนเช่นกัน
- เมื่อนำไวยากรณ์หรือพฤติกรรมใหม่ของนิพจน์ทั่วไปมาใช้ ควรพิจารณาความเข้ากันได้กับโค้ดเดิม ผลกระทบด้านประสิทธิภาพ และช่วงการเรียนรู้ภายในทีม พร้อมประเมินทั้งประโยชน์และต้นทุนของการเปลี่ยนแปลงนั้นอย่างรอบคอบ
1 ความคิดเห็น
ความเห็นจาก Hacker News
grep,sed,awk, Python ฯลฯ) โดยค่าเริ่มต้นจะมองว่าเป็นจุดสิ้นสุดของบรรทัด