ทำไมจึงมีหลากหลายรูปแบบการแสดงออกปกติ? [ปิด]


14

วันนี้เมื่อฉันตรวจสอบซอร์สโค้ดของโครงการฉันพบว่ามี "ช่องว่าง" และ "แท็บ" ที่ไม่จำเป็นจำนวนมากอยู่ที่ปลายแต่ละบรรทัด ดังนั้นฉันตัดสินใจที่จะลบพวกเขาด้วยการแสดงออกปกติ

อย่างไรก็ตามฉันพบว่าคำสั่งsed -i '/\s+$/d'ไม่ทำงาน จนกว่าฉันจะเปลี่ยนคำสั่งเป็นsee -ri '/\s+$/d'มันทำหน้าที่เป็นความคาดหวังของฉัน จากคู่มือของsedมันกล่าวว่า-rจะเรียก regexp เพิ่มเติม

ฉันสับสนทำไมมีหลายสายพันธุ์ regexp? เช่น regim เป็นกลุ่ม / emacs / perl / sed ทำไม regexp จึงเสนอส่วนต่อประสานผู้ใช้ที่ไม่ซ้ำกัน

คำตอบ:


19

ด้วยเหตุผลทางประวัติศาสตร์ ไม่มีคำจำกัดความของไวยากรณ์ "นิพจน์ปกติ" แนวคิดของนิพจน์ทั่วไปนั้นไม่มีส่วนเกี่ยวข้องกับไวยากรณ์จริงที่อธิบายอย่างเป็นทางการ ผู้คนคิดวิธีต่างกันในการพูดสิ่งเดียวกันดังนั้นรูปแบบที่แตกต่างกันของไวยากรณ์ของ regex

อย่างไรก็ตามคุณจะพบว่ามีคำจำกัดความสองกลุ่มส่วนใหญ่ในช่วงเวลาเหล่านี้:

  1. POSIX นิพจน์ทั่วไปที่ระบุ Basic (BRE) และ Extended Regular Expressions (ERE) ความสับสนเริ่มต้นที่ตัวอย่างเช่นนิพจน์ปกติพื้นฐานใช้\( \)เพื่อแสดงกลุ่มและนิพจน์ทั่วไปที่ขยายใช้( )สำหรับสิ่งนั้น

  2. การแสดงออกปกติ Perl-based การแสดงออกปกติ Perl กำหนดไวยากรณ์สอดคล้องกันมากขึ้นที่ตัวอย่างเช่น backslash มักจะหลบหนีตัวละครที่ไม่ใช่ตัวอักษรและตัวเลข ไวยากรณ์ Perl regex พบได้ในภาษาการเขียนโปรแกรมยอดนิยมในทุกวันนี้ตั้งแต่ Java ถึง Ruby

คุณสามารถตรวจสอบบทความ Wikipedia เกี่ยวกับไวยากรณ์ regexสำหรับข้อมูลเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.