ทำไมคำสั่ง regex บางคำจึงมีคำว่า '\' ตรงข้ามกับอักขระต่าง ๆ ?


10

ยกตัวอย่างเช่นคำสั่งนี้:

find . -regex ".*\.\(cpp\|h\)"

นี่จะค้นหาไฟล์. h และ. cpp ทั้งหมดในไดเรกทอรีของคุณ อักขระระยะเวลา '.' ในการแสดงออกปกติมักจะหมายถึง "ตัวละครใด ๆ " เพื่อให้ตรงกับช่วงเวลาจริงคุณต้องหลบหนีโดยใช้เครื่องหมายแบ็กสแลช '\'

ในกรณีนี้ให้ตัวละครที่มีความหมายพิเศษคุณต้องหลบหนีเพื่อให้ได้ตัวละครที่แท้จริงที่มันหมายถึง

ตอนนี้ใช้วงเล็บและแถบ "หรือ" เป็นอักขระ '(', ')' และ '|' ตามลำดับ สิ่งเหล่านี้มีความหมายพิเศษซึ่งใช้สำหรับจัดกลุ่มนิพจน์ทั่วไป อย่างไรก็ตามเพื่อให้ได้ความหมายพิเศษตัวละครจะต้องถูกหลบหนีโดยใช้เครื่องหมายทับขวา! หากไม่มีเครื่องหมายแบ็กสแลชอักขระจะมีความหมายของอักขระจริงที่แสดงถึง

ทำไม '.' ถือว่าแตกต่างจาก '(', ')' และ '|'?

คำตอบ:


12

คำตอบคือ "เพียงเพราะ" มีไวยากรณ์นิพจน์ทั่วไปที่แตกต่างกันจำนวนมากและแม้ว่าพวกเขาจะมีลักษณะที่คล้ายกันและโดยทั่วไปแล้วพื้นฐานจะเหมือนกัน แต่จะแตกต่างกันไปในแต่ละรายการ

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

มีความพยายามในการสร้างมาตรฐานจาก POSIX ซึ่งกำหนด " นิพจน์ปกติพื้นฐาน " และ " นิพจน์ทั่วไปที่ขยาย " awesomely เหล่านี้ย้อนหลังการทำงานจากแต่ละอื่น ๆ ในการไปถึง\- บางครั้งแต่ไม่ได้มีความสอดคล้องที่สมบูรณ์แบบ

การแสดงออกปกติ Perl ได้กลายเป็นมาตรฐาน defacto อีกประการด้วยเหตุผลสองประการคือประการแรกพวกเขามีความยืดหยุ่นและทรงพลังและที่สองพวกเขามีสติสัมปชัญญะจริง ๆด้วยอนุสัญญาเช่น "\

GNU Find มี-regextypeตัวเลือกที่คุณสามารถเปลี่ยนไวยากรณ์นิพจน์ทั่วไปที่ใช้ น่าเศร้าที่ "perl" ไม่ใช่ตัวเลือกอย่างน้อยในรุ่น find ฉันมี (ค่าเริ่มต้นคือไม่แปลกใจจาก GNU, "emacs" และไวยากรณ์นั้นมีการบันทึกไว้ที่นี่ )

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