อ่าน 6 นาที
นิพจน์ปกติที่เข้ากันได้กับ Perl
Perl Compatible Regular Expressions ( PCRE ) เป็น ไลบรารี ที่เขียนด้วยภาษา C ซึ่งใช้ กลไก นิพจน์ปกติ ที่ได้รับแรงบันดาลใจจากความสามารถของ ภาษาโปรแกรม Perl Philip Hazel เริ่มเขียน...
นิพจน์ปกติที่เข้ากันได้กับ Perl
| นิพจน์ปกติที่เข้ากันได้กับ Perl | |
|---|---|
| ผู้เขียนต้นฉบับ | ฟิลิป เฮเซล |
| เวอร์ชันเสถียร | |
| เขียนเป็น | ซี |
| ระบบปฏิบัติการ | ข้ามแพลตฟอร์ม |
| พิมพ์ | ไลบรารีการจับคู่รูปแบบ |
| ใบอนุญาต | บีเอสดี |
| เว็บไซต์ | pcre.org |
| ที่เก็บข้อมูล |
|
Perl Compatible Regular Expressions ( PCRE ) เป็นไลบรารีที่เขียนด้วยภาษาCซึ่งใช้ กลไก นิพจน์ปกติที่ได้รับแรงบันดาลใจจากความสามารถของภาษาโปรแกรม Perl Philip Hazelเริ่มเขียน PCRE ในช่วงฤดูร้อนปี 1997 [ 3 ]ไวยากรณ์ของ PCRE มีประสิทธิภาพและยืดหยุ่นกว่า นิพจน์ ปกติของ POSIX ทั้งสองแบบ (BRE, ERE) [ 4 ]และมากกว่าไลบรารีนิพจน์ปกติอื่นๆ อีกมากมาย
แม้ว่าเดิมที PCRE มีเป้าหมายเพื่อให้มีคุณสมบัติเทียบเท่ากับ Perl แต่การใช้งานทั้งสองนั้นไม่เทียบเท่ากันอย่างสมบูรณ์ ในช่วง PCRE 7.x และ Perl 5.9.x ทั้งสองโครงการได้ประสานงานการพัฒนา โดยมีการถ่ายโอนคุณสมบัติระหว่างกันในทั้งสองทิศทาง[ 5 ]
ในปี 2015 มีการเผยแพร่เวอร์ชันแยกของ PCRE พร้อมด้วยอินเทอร์เฟซการเขียนโปรแกรม (API) ที่ปรับปรุงใหม่ ซอฟต์แวร์ดั้งเดิม ซึ่งปัจจุบันเรียกว่า PCRE1 (ซีรี่ส์ 1.xx–8.xx) ได้รับการแก้ไขข้อบกพร่องแล้ว แต่ไม่มีการพัฒนาเพิ่มเติม แม้ว่าจะยังคงใช้งานอยู่ในระบบเก่าบางระบบ แต่ PCRE1 ไม่ได้รับการดูแลรักษาอย่างต่อเนื่องอีกต่อไป และคาดว่าเวอร์ชัน 8.45 ปัจจุบันจะเป็นเวอร์ชันสุดท้าย โค้ด PCRE2 ใหม่ (ซีรี่ส์ 10.xx) มีส่วนขยายและการปรับปรุงการเขียนโค้ดจำนวนมาก และเป็นแหล่งพัฒนาหลัก
โปรแกรมโอเพนซอร์สที่มีชื่อเสียงหลาย โปรแกรม เช่นเซิร์ฟเวอร์ HTTP ApacheและNginx รวมถึงภาษาสคริปต์ PHPและRต่างก็ใช้ไลบรารี PCRE ซอฟต์แวร์กรรมสิทธิ์ก็สามารถทำเช่นเดียวกันได้ เนื่องจากไลบรารีนี้ได้รับอนุญาตภายใต้สัญญาอนุญาต BSD นอกจากนี้ ตั้งแต่ Perl เวอร์ชัน 5.10 เป็นต้นไป PCRE ยังมีให้ใช้งานเป็นตัวแทนของเครื่องมือประมวลผลนิพจน์ปกติเริ่มต้นของ Perl ผ่านทางre::engine::PCREโมดูล อีกด้วย
ไลบรารีนี้สามารถสร้างได้บน Unix, Windows และสภาพแวดล้อมอื่นๆ อีกหลายอย่าง PCRE2 มาพร้อมกับตัวห่อ POSIX C [หมายเหตุ 1 ]โปรแกรมทดสอบหลายโปรแกรม และโปรแกรมยูทิลิตี้pcregrep/ pcre2grepที่สร้างขึ้นพร้อมกับไลบรารี
คุณสมบัติ
การสนับสนุนคอมไพเลอร์แบบทันเวลาพอดี
สามารถเปิดใช้งานคอมไพเลอร์แบบทันที ( just-in-time compiler)ได้เมื่อสร้างไลบรารี PCRE2 ประโยชน์ด้านประสิทธิภาพที่สำคัญสามารถเกิดขึ้นได้เมื่อ (ตัวอย่างเช่น) โปรแกรมที่เรียกใช้งานคุณสมบัตินี้ร่วมกับรูปแบบที่เข้ากันได้ซึ่งถูกเรียกใช้งานซ้ำๆ การสนับสนุนคอมไพเลอร์แบบทันทีนี้เขียนโดย Zoltan Herczeg และไม่ได้กล่าวถึงในตัวห่อ POSIX
การจัดการหน่วยความจำที่ยืดหยุ่น
การใช้สแต็กของระบบสำหรับการย้อนกลับอาจก่อให้เกิดปัญหาใน PCRE1 ซึ่งเป็นเหตุผลที่ฟีเจอร์นี้ถูกเปลี่ยนแปลงใน PCRE2 ปัจจุบันมีการใช้ฮีปเพื่อจุดประสงค์นี้แทน และสามารถจำกัดปริมาณรวมได้ ปัญหาสแต็กโอเวอร์โฟลว์ซึ่งเกิดขึ้นบ่อยครั้งใน PCRE1 ไม่เป็นปัญหาอีกต่อไปใน PCRE2 ตั้งแต่เวอร์ชัน 10.30 (2017)
กฎการหลบหนีที่สอดคล้องกัน
เช่นเดียวกับ Perl, PCRE2 มีกฎการหลีกเลี่ยงอักขระที่สม่ำเสมอ: อักขระที่ไม่ใช่ตัวอักษรและตัวเลขใดๆ สามารถหลีกเลี่ยงให้มีความหมายตามตัวอักษรได้โดยการใส่เครื่องหมาย\แบ็กสแลช (\) ไว้ข้างหน้าอักขระนั้น อักขระตัวอักษรและตัวเลขใดๆ ที่นำหน้าด้วยแบ็กสแลชโดยทั่วไปจะมีความหมายพิเศษ ในกรณีที่ไม่ได้กำหนดให้ลำดับนั้นมีความหมายพิเศษ จะเกิดข้อผิดพลาดขึ้น ซึ่งแตกต่างจาก Perl ที่จะแสดงข้อผิดพลาดเฉพาะเมื่ออยู่ในโหมดเตือน (PCRE2 ไม่มีโหมดเตือน) ในนิพจน์ปกติพื้นฐานของ POSIX บางครั้งแบ็กสแลชจะหลีกเลี่ยงอักขระที่ไม่ใช่ตัวอักษรและตัวเลข (เช่น\.) และบางครั้งก็เพิ่มคุณลักษณะพิเศษ (เช่น\(\))
คลาสตัวละครเพิ่มเติม
นอกจากชื่อ POSIX ที่ยาวกว่าแล้ว ยังรองรับคลาสอักขระตัวอักษรเดี่ยว ด้วย ตัวอย่างเช่น \dจะตรงกับตัวเลขใดๆ ได้อย่างแม่นยำเช่นเดียวกับ[[:digit:]]ในนิพจน์ปกติของ POSIX
การจับคู่ขั้นต่ำ (หรือเรียกอีกอย่างว่า "ไม่โลภ")
สามารถวางตัวอักษร 'A' ?ไว้หลังตัวระบุการทำซ้ำใดๆ เพื่อแสดงว่าควรใช้การจับคู่ที่สั้นที่สุด โดยค่าเริ่มต้นคือการพยายามจับคู่ที่ยาวที่สุดก่อน แล้วจึงย้อนกลับไปหาการจับคู่ที่สั้นกว่า เช่น 'A' a.*?bจะจับคู่ 'ab' ใน 'ababab' ก่อน ในขณะที่ 'A' a.*bจะจับคู่ทั้งสตริง
ถ้าUตั้งค่าแฟล็กไว้ ตัวระบุปริมาณจะเป็นแบบไม่โลภ (lazy) โดยค่าเริ่มต้น ในขณะที่ถ้า ตั้งค่าเป็นแบบ ?ไม่โลภ จะทำให้ตัวระบุปริมาณเป็นแบบโลภ
คุณสมบัติของอักขระยูนิโค้ด
Unicodeกำหนดคุณสมบัติหลายอย่างสำหรับแต่ละอักขระ รูปแบบใน PCRE2 สามารถจับคู่คุณสมบัติเหล่านี้ได้ เช่นจะจับคู่สตริงที่ขึ้นต้นด้วย "เครื่องหมายวรรคตอนเปิด" ใดๆ และลงท้ายด้วย "เครื่องหมายวรรคตอนปิด" ใดๆ เช่นการจับคู่เมตาอักขระ "ปกติ" บางตัวสามารถควบคุมได้ด้วยคุณสมบัติของ Unicode เมื่อตั้งค่าตัวเลือกการคอมไพล์ PCRE2_UCP ตัวเลือกนี้สามารถตั้งค่าสำหรับรูปแบบได้โดยการใส่ไว้ที่จุดเริ่มต้นของรูปแบบ ตัวเลือกนี้จะเปลี่ยนพฤติกรรมของเมตาอักขระต่อไปนี้: , , , , , , , , และคลาสอักขระ POSIX บางส่วน ตัวอย่างเช่น ชุดอักขระที่จับคู่โดย(อักขระคำ) จะขยายเพื่อรวมตัวอักษรและตัวอักษรที่มีเครื่องหมายเน้นเสียงตามที่กำหนดโดยคุณสมบัติของ Unicode การจับคู่แบบนี้จะช้ากว่าทางเลือกปกติ ( เฉพาะ ASCII ) ที่ไม่ใช้ UCP โปรดทราบว่าตัวเลือก UCP ต้องการให้ไลบรารีได้รับการสร้างขึ้นเพื่อรวมการสนับสนุน Unicode (นี่คือค่าเริ่มต้นสำหรับ PCRE2) เวอร์ชันแรกๆ ของ PCRE1 รองรับเฉพาะรหัส ASCII เท่านั้น ต่อมาได้เพิ่มการสนับสนุนUTF-8 มีการเพิ่ม การรองรับUTF-16ในเวอร์ชัน 8.30 และการรองรับ UTF-32 ในเวอร์ชัน 8.32 PCRE2 รองรับการเข้ารหัส UTF ทั้งสามแบบมาโดยตลอด \p{Ps}.*?\p{Pe}[abc](*UCP)\B\b\D\d\S\s\W\w\w
การจับคู่หลายบรรทัด
^และ$สามารถจับคู่ได้เฉพาะที่ต้นและท้ายของสตริง หรือที่ต้นและท้ายของแต่ละ "บรรทัด" ภายในสตริง ขึ้นอยู่กับตัวเลือกที่ตั้งไว้
ตัวเลือกการขึ้นบรรทัดใหม่/เว้นบรรทัด
เมื่อคอมไพล์ PCRE ระบบจะเลือกค่าเริ่มต้นของตัวขึ้นบรรทัดใหม่ ตัวขึ้นบรรทัดใหม่/การเว้นบรรทัดที่ใช้งานอยู่จะมีผลต่อตำแหน่งที่ PCRE ตรวจจับ^จุดเริ่มต้นและ$จุดสิ้นสุดของบรรทัด (ในโหมดหลายบรรทัด) รวมถึงสิ่งที่ตรงกับจุด (โดยไม่คำนึงถึงโหมดหลายบรรทัด เว้นแต่(?s)จะตั้งค่าตัวเลือก dotall ไว้) นอกจากนี้ยังส่งผลต่อขั้นตอนการจับคู่ของ PCRE (ตั้งแต่เวอร์ชัน 7.0) ด้วย กล่าวคือ เมื่อรูปแบบที่ไม่ได้ยึดตรึงไม่ตรงกับจุดเริ่มต้นของลำดับตัวขึ้นบรรทัดใหม่ PCRE จะข้ามลำดับตัวขึ้นบรรทัดใหม่ทั้งหมดก่อนที่จะลองจับคู่ใหม่อีกครั้ง หากตัวเลือกตัวขึ้นบรรทัดใหม่ที่ใช้งานอยู่มี CRLF เป็นหนึ่งในตัวเว้นบรรทัดที่ถูกต้อง ระบบจะไม่ข้าม\nCRLF หากรูปแบบมีอักขระเฉพาะ\rหรือ\nการอ้างอิง (ตั้งแต่เวอร์ชัน 7.3) ตั้งแต่เวอร์ชัน 8.10 อักขระพิเศษ\Nจะตรงกับอักขระใดๆ ก็ตามที่ไม่ใช่อักขระเว้นบรรทัด โดยมีพฤติกรรมเช่นเดียวกับ เมื่อ ไม่ได้ตั้งค่า .ตัวเลือก dotall ไว้(?s)
สามารถเปลี่ยนแปลงตัวเลือกการขึ้นบรรทัดใหม่ได้ด้วยตัวเลือกภายนอกเมื่อทำการคอมไพล์และเมื่อรัน PCRE แอปพลิเคชันบางตัวที่ใช้ PCRE จะให้ผู้ใช้สามารถใช้การตั้งค่านี้ผ่านตัวเลือกภายนอกได้ ดังนั้น ตัวเลือกการขึ้นบรรทัดใหม่จึงสามารถระบุไว้ที่จุดเริ่มต้นของรูปแบบได้โดยใช้หนึ่งในวิธีต่อไปนี้:
(*LF)อักขระขึ้นบรรทัดใหม่ (Newline) คืออักขระป้อนบรรทัด สามารถจับคู่การขึ้นบรรทัดใหม่ที่สอดคล้องกันได้ด้วย\n.(*CR)Newline คือการขึ้นบรรทัดใหม่สามารถจับคู่การขึ้นบรรทัดใหม่ที่สอดคล้องกันได้ด้วย\r.(*CRLF)ขึ้นบรรทัดใหม่/เว้นวรรคบรรทัด คือการขึ้นบรรทัดใหม่แบบ carriage return ตามด้วยการป้อนบรรทัดใหม่ (linefeed) สามารถจับคู่การเว้นวรรคบรรทัดที่สอดคล้องกันได้ด้วย\r\n.(*ANYCRLF)หากพบอักขระใดๆ ข้างต้นในข้อมูล จะทำให้เกิดการประมวลผลขึ้นบรรทัดใหม่ สามารถจับคู่การขึ้นบรรทัดใหม่ที่สอดคล้องกันได้ด้วยหรือ ด้วยดูรายละเอียดการกำหนดค่าและตัวเลือกเกี่ยวกับการจับคู่กับเครื่องหมายแบ็กสแลช-R ด้านล่าง(?:\r\n?|\n)\R(*ANY)ตัวเลือกใดๆ ข้างต้น รวมถึงการขึ้นบรรทัดใหม่แบบพิเศษของ Unicode ด้วย
เมื่อไม่ได้อยู่ในโหมด UTF-8 การขึ้นบรรทัดใหม่ที่สอดคล้องกันสามารถจับคู่ได้ด้วย[หมายเหตุ 2 ]หรือ. (?:\r\n?|\n|\x0B|\f|\x85)\R
ในโหมด UTF-8 อักขระเพิ่มเติมสองตัวจะถูกรับรู้ว่าเป็นตัวขึ้นบรรทัดใหม่ด้วย(*ANY):
- LS (ตัวคั่นบรรทัด, U+2028)
- PS (ตัวคั่นย่อหน้า, U+2029)
ในระบบปฏิบัติการ Windows สำหรับข้อมูลที่ไม่ใช่ Unicode ANYอักขระขึ้นบรรทัดใหม่บางตัวมีความหมายแตกต่างออกไป
ตัวอย่างเช่น\x85สามารถจับคู่กับจุดไข่ปลาแนวนอนได้ และหากพบในขณะที่ANYมีการขึ้นบรรทัดใหม่ ระบบจะกระตุ้นการประมวลผลการขึ้นบรรทัดใหม่
ดูรายละเอียดการตั้งค่าและตัวเลือกต่างๆ เกี่ยวกับการจับคู่กับเครื่องหมายแบ็กสแลช-R ด้านล่าง
ตัวเลือก Backslash-R
เมื่อคอมไพล์ PCRE ระบบจะเลือกค่าเริ่มต้นสำหรับการจับคู่ ค่าเริ่ม\Rต้นอาจเป็นการจับคู่กับตัวแบ่งบรรทัดที่สอดคล้องกับ ANYCRLF หรือตัวแบ่งบรรทัดที่สอดคล้องกับ ANY ก็ได้ สามารถแทนที่ค่าเริ่มต้นได้เมื่อจำเป็นโดยการใส่(*BSR_UNICODE)หรือ(*BSR_ANYCRLF)ไว้ที่จุดเริ่มต้นของรูปแบบสามารถระบุตัวเลือกเพิ่มเติมได้นอกเหนือจากตัวเลือก เช่นตัวเลือก backslash-R ยังสามารถเปลี่ยนแปลงได้ด้วยตัวเลือกภายนอกโดยแอปพลิเคชันที่เรียกใช้ PCRE2 เมื่อคอมไพล์รูปแบบ (*newline)(*BSR..)(*BSR_UNICODE)(*ANY)rest-of-pattern
ตัวเลือกเริ่มต้นของรูปแบบ
ตัวเลือกการขึ้นบรรทัดใหม่ตามที่(*LF)ได้อธิบายไว้ข้างต้น; ตัวเลือกเครื่องหมายแบ็กสแลช-R ตามที่(*BSR_ANYCRLF)ได้อธิบายไว้ข้างต้น; ตัวเลือกคุณสมบัติอักขระยูนิโค้ด ตาม (*UCP)ที่ได้อธิบายไว้ข้างต้น; (*UTF8)ตัวเลือกที่ระบุไว้ดังนี้: หาก PCRE2 ได้รับการคอมไพล์โดยรองรับUTF(*UTF)แล้ว สามารถใช้ตัวเลือกที่อยู่ตอนต้นของรูปแบบแทนการตั้งค่าตัวเลือกภายนอกเพื่อเรียกใช้โหมด UTF-8, UTF-16 หรือ UTF-32 ได้
การอ้างอิงย้อนกลับ
รูปแบบอาจอ้างอิงถึงผลลัพธ์ของการจับคู่ครั้งก่อน ตัวอย่างเช่น(a|b)c\1จะตรงกับ "aca" หรือ "bcb" และจะไม่ตรงกับ "acb" เป็นต้น
รูปแบบย่อยที่มีชื่อ
รูปแบบย่อย (ที่ล้อมรอบด้วยวงเล็บ เช่น(...)) อาจตั้งชื่อได้โดยการใส่?P<name>คำนำหน้าหลังวงเล็บเปิด รูปแบบย่อยที่มีชื่อเป็นคุณสมบัติที่ PCRE นำมาจากนิพจน์ปกติ ของ Python
ต่อมา Perl ก็ได้นำคุณสมบัตินี้มาใช้ ดังนั้นตอนนี้จึงสามารถกำหนดกลุ่มที่มีชื่อได้โดยใช้(?<name>...)หรือ(?'name'...)เช่นเดียวกับ(?P<name>...)กลุ่มที่มีชื่อสามารถอ้างอิงย้อนกลับได้ด้วย ตัวอย่างเช่น: (?P=name)(ไวยากรณ์ Python) หรือ\k'name'(ไวยากรณ์ Perl)
ซับรูทีน
ในขณะที่ backreference เป็นกลไกในการอ้างอิงถึงส่วนของหัวข้อที่เคยตรงกับรูปแบบย่อยมาก่อน subroutine เป็นกลไกในการนำรูปแบบย่อยที่กำหนดไว้ก่อนหน้านี้มาใช้ซ้ำ ตัวเลือกของรูปแบบย่อย เช่น การไม่ขึ้นอยู่กับตัวพิมพ์ใหญ่-เล็ก จะถูกกำหนดไว้ตายตัวเมื่อมีการกำหนดรูปแบบย่อย ตัวอย่างเช่น(a.c)(?1)จะตรงกับ "aacabc" หรือ "abcadc" ในขณะที่การใช้ backreference จะไม่ตรงกัน ถึงแม้ว่าทั้งสองแบบจะตรงกับ "aacaac" หรือ "abcabc" ก็ตาม PCRE ยังรองรับโครงสร้าง Oniguruma(a.c)\1ที่ไม่ใช่ของ Perl สำหรับ subroutine ด้วย โดยจะระบุโดยใช้หรือ\g<subpat-number>\g<subpat-name>
การจัดกลุ่มอะตอม
การจัดกลุ่มอะตอมิกเป็นวิธีป้องกันการย้อนกลับในรูปแบบ ตัวอย่างเช่นa++bcจะจับคู่ "a" ให้ได้มากที่สุดเท่าที่จะเป็นไปได้ และจะไม่ย้อนกลับไปลองจับคู่กับตัวอักษร "a" ที่น้อยกว่าหนึ่งตัว
การยืนยันที่มองไปข้างหน้าและมองย้อนกลับไป
| การยืนยัน | มองไปข้างหลัง | มองไปข้างหน้า |
|---|---|---|
| เชิงบวก | (? <= รูปแบบ ) | (? = รูปแบบ ) |
| เชิงลบ | (? <! รูปแบบ ) | (? !ลวดลาย ) |
| การยืนยันแบบมองย้อนหลังและมองไปข้างหน้าในนิพจน์ปกติ ของ Perl | ||
รูปแบบอาจยืนยันว่าข้อความก่อนหน้าหรือข้อความถัดไปมีรูปแบบนั้นอยู่ โดยไม่รวมข้อความที่ตรงกัน (การยืนยันแบบไม่มีความกว้าง) ตัวอย่างเช่น / \w+(?=\t)/ จะตรงกับคำที่ตามด้วยแท็บโดยไม่รวมแท็บนั้นเอง
คำสั่ง Look-behind ไม่สามารถมีความยาวที่ไม่แน่นอนได้ แม้ว่า (ต่างจากภาษา Perl) แต่ละสาขาจะมีความยาวคงที่ที่แตกต่างกันได้ก็ตาม
\Kสามารถใช้ในรูปแบบเพื่อรีเซ็ตจุดเริ่มต้นของการจับคู่ทั้งหมดในปัจจุบันได้ วิธีนี้เป็นทางเลือกที่ยืดหยุ่นกว่าการตรวจสอบย้อนหลัง เนื่องจากส่วนที่ถูกละทิ้งของการจับคู่ (ส่วนที่อยู่ก่อนหน้า\K) ไม่จำเป็นต้องมีความยาวคงที่
ลำดับการหลีกเลี่ยงสำหรับการยืนยันที่มีความกว้างเป็นศูนย์
เช่น\bสำหรับการจับคู่ "ขอบเขตคำ" ที่มีความกว้างเป็นศูนย์ คล้ายกับ. (?<=\W)(?=\w)|(?<=\w)(?=\W)|^|$
ความคิดเห็น
ข้อความแสดงความคิดเห็นจะเริ่มต้นด้วย(?#และสิ้นสุดที่วงเล็บปิดถัดไป
รูปแบบการเรียกซ้ำ
รูปแบบหนึ่งสามารถอ้างอิงกลับไปยังตัวมันเองแบบวนซ้ำ หรือไปยังรูปแบบย่อยใดๆ ก็ได้ ตัวอย่างเช่น รูปแบบนี้จะตรงกับวงเล็บที่สมดุลและตัวอักษร "a" ทุกรูปแบบ \((a*|(?R))*\)
ข้อความเรียกทั่วไป
นิพจน์ PCRE สามารถฝังค่าได้โดยที่nคือจำนวนใดๆ ซึ่งจะเรียกใช้ฟังก์ชันที่ผู้ใช้กำหนดเองจากภายนอกผ่าน API ของ PCRE และสามารถใช้เพื่อฝังโค้ดใดๆ ลงในรูปแบบได้ (?Cn)
ความแตกต่างจาก Perl
ความแตกต่างระหว่าง PCRE2 และ Perl (ณ Perl 5.9.4) รวมถึงแต่ไม่จำกัดเพียง: [ 6 ]
ก่อนเวอร์ชัน 10.30 การจับคู่แบบเรียกซ้ำเป็นแบบอะตอมิกใน PCRE และไม่ใช่แบบอะตอมิกใน Perl
นั่นหมายความว่ามันจะตรงกันใน Perl แต่จะไม่ตรงกันใน PCRE2 จนกว่าจะถึงเวอร์ชัน 10.30 "<<!>!>!>><>>!>!>!>"=~ /^(<(?:[^<>]+|(?3)|(?1))*>)()(!>!>!>)$/
ค่าของบัฟเฟอร์การจับภาพที่ได้จาก?ตัวระบุปริมาณ (ตรงกัน 1 หรือ 0 ครั้ง) เมื่อซ้อนอยู่ในบัฟเฟอร์การจับภาพที่ระบุปริมาณอีกอันหนึ่งจะมีค่าแตกต่างกัน
ใน Perl จะได้ผลลัพธ์ที่มี "a" และ"b " แต่ใน PCRE จะได้ผลลัพธ์ที่มี "b" "aba"=~ /^(a(b)?)+$/;$1$2undef$2
PCRE อนุญาตให้ตั้งชื่อบัฟเฟอร์จับภาพด้วยตัวเลขได้ ในขณะที่ Perl กำหนดให้ชื่อต้องเป็นไปตามกฎของคำเปล่า
นี่หมายความว่า\g{}ไม่กำกวมในภาษา Perl แต่อาจกำกวมใน PCRE
นี่ไม่ใช่ความแตกต่างอีกต่อไปนับตั้งแต่ PCRE 8.34 (เผยแพร่เมื่อ 15 ธันวาคม 2013) ซึ่งไม่อนุญาตให้ชื่อกลุ่มเริ่มต้นด้วยตัวเลขอีกต่อไป[ 7 ]
PCRE อนุญาตให้ใช้ทางเลือกต่างๆ ภายใน lookbehind ที่มีความยาวแตกต่างกันได้
ภายในคำสั่ง lookbehind assertions ทั้ง PCRE และ Perl กำหนดให้ใช้รูปแบบที่มีความยาวคงที่
กล่าวคือ ทั้ง PCRE และ Perl ไม่อนุญาตให้ใช้รูปแบบที่มีความยาวแปรผันโดยใช้ตัวระบุปริมาณภายในคำสั่ง lookbehind
อย่างไรก็ตาม Perl กำหนดให้สาขาทางเลือกทั้งหมดของการยืนยันแบบ lookbehind ต้องมีความยาวเท่ากัน ในขณะที่ PCRE อนุญาตให้สาขาทางเลือกเหล่านั้นมีความยาวแตกต่างกันได้ ตราบใดที่แต่ละสาขายังคงมีความยาวคงที่
PCRE ไม่รองรับโครงสร้าง Perl "แบบทดลอง" บางอย่าง
เช่น(??{...})(ฟังก์ชันเรียกกลับที่ค่าที่ส่งคืนจะถูกประเมินว่าเป็นส่วนหนึ่งของรูปแบบ) หรือ(?{})โครงสร้าง แม้ว่าโครงสร้างหลังจะสามารถจำลองได้โดยใช้(?Cn).
คำสั่งควบคุมการเรียกซ้ำที่เพิ่มเข้ามาใน Perl เวอร์ชัน 5.9.x ก็ไม่ได้รับการสนับสนุนเช่นกัน
การรองรับคำสั่งควบคุมการย้อนกลับแบบทดลอง (เพิ่มเข้ามาใน Perl 5.10) มีให้ใช้งานใน PCRE ตั้งแต่เวอร์ชัน 7.3 เป็นต้นไป
ได้แก่(*FAIL), (*F), (*PRUNE), (*SKIP), (*THEN), (*COMMIT), และ(*ACCEPT).
โดยทั่วไปแล้ว Perl ไม่รองรับการใช้พารามิเตอร์ร่วมกับคำสั่งควบคุมการย้อนกลับ (backtracking control verbs)
อย่างไรก็ตาม โปรดทราบว่าตั้งแต่เวอร์ชัน 8.10 เป็นต้นไป PCRE รองรับคำกริยาต่อไปนี้พร้อมอาร์กิวเมนต์ที่ระบุ: (*MARK:markName), (*SKIP:markName), (*PRUNE:markName), และ(*THEN:markName).
ตั้งแต่เวอร์ชัน 10.32 เป็นต้นมา PCRE2 รองรับ(*ACCEPT:markName), (*FAIL:markName), และ(*COMMIT:markName)แล้ว
PCRE และ Perl มีความแตกต่างกันเล็กน้อยในเรื่องความทนทานต่อโครงสร้างที่ผิดพลาด
Perl อนุญาตให้ใช้ตัวระบุปริมาณใน(?!...)โครงสร้าง ซึ่งไม่มีความหมายแต่ก็ไม่เป็นอันตราย (ถึงแม้จะไม่มีประสิทธิภาพก็ตาม) PCRE จะแสดงข้อผิดพลาดในเวอร์ชันก่อน 8.13
PCRE มีข้อจำกัดที่เข้มงวดเกี่ยวกับความลึกของการเรียกซ้ำ แต่ Perl ไม่มี
ตัวเลือกการสร้างแบบเริ่มต้นจะไม่ตรงกันเนื่องจากข้อจำกัด แต่ Perl จะตรงกันอย่างถูกต้อง "bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"=~ /.X(.+)+X/
Perl ใช้ฮีปสำหรับการเรียกซ้ำและไม่มีข้อจำกัดตายตัวสำหรับความลึกของการเรียกซ้ำ ในขณะที่ PCRE2 มีข้อจำกัดเริ่มต้นที่กำหนดไว้ในระหว่างการคอมไพล์ ซึ่งสามารถปรับเพิ่มหรือลดได้โดยแอปพลิเคชันที่เรียกใช้
การตรวจสอบ
นอกเหนือจากประเด็นข้างต้นแล้ว PCRE สามารถผ่านการทดสอบในt/op/re_testsไฟล์ " " ของ Perl ซึ่งเป็นหนึ่งในการทดสอบการถดถอยระดับไวยากรณ์หลักสำหรับเอ็นจิ้นนิพจน์ปกติของ Perl ได้
ดูเพิ่มเติม
หมายเหตุและเอกสารอ้างอิง
หมายเหตุ
เอกสารอ้างอิง
- ^ เวอร์ชันสุดท้ายของ PCRE1: https://lists.exim.org/lurker/message/20210615.162400.c16ff8a3.en.html
- ^ การเผยแพร่: https://github.com/PCRE2Project/pcre2/releases
- ^ Exim และ PCRE: ซอฟต์แวร์เสรีเข้ามาครอบงำชีวิตผมได้อย่างไร (1999-12) โดยฟิลิป เฮเซลหน้า 7: https://www.ukuug.org/events/winter99/proc/PH.ps
แล้ว PCRE ล่ะ?
- เขียนขึ้นในฤดูร้อนปี 1997 และเผยแพร่บนเว็บไซต์ ftp
- ผู้คนพบเข้า และเริ่มสร้างรายชื่อผู้รับอีเมล
- มีการปรับปรุงเล็กน้อยเกิดขึ้นเรื่อยๆ
- ^
- นิพจน์ปกติ (Regular Expression) - มาตรฐาน POSIX: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html
- ยูทิลิตี้ § สัญกรณ์การจับคู่รูปแบบ: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#tag_18_13
- คำจำกัดความพื้นฐาน § นิพจน์ปกติพื้นฐาน: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/V1_chap09.html#tag_09_03
- เหตุผล § นิพจน์ปกติ: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/xrat/V4_xbd_chap09.html#tag_21_09
- ^ PCRE2 - นิพจน์ปกติที่เข้ากันได้กับ Perl (API ที่ปรับปรุงใหม่) (2020) โดยมหาวิทยาลัยเคมบริดจ์ : https://pcre.org/pcre2.txt
- ^ ความแตกต่างระหว่าง PCRE2 และ Perl (13 กรกฎาคม 2019) โดย Philip Hazel : https://www.pcre.org/current/doc/html/pcre2compat.html
- ^ อ้างอิงจากบันทึกการเปลี่ยนแปลงของ PCRE ( https://www.pcre.org/original/changelog.txt ): "Perl ไม่อนุญาตให้ชื่อกลุ่มขึ้นต้นด้วยตัวเลขอีกต่อไป ดังนั้นฉันจึงได้ทำการเปลี่ยนแปลงนี้ใน PCRE ด้วย"
- ^ บันทึกการเปลี่ยนแปลงสำหรับ PCRE2: https://www.pcre.org/changelog.txt
ลิงก์ภายนอก
- เว็บไซต์อย่างเป็นทางการ

- PCRE - รายชื่อผู้รับจดหมายสำหรับการพัฒนา: https://groups.google.com/g/pcre2-dev
- PCRE - ระบบติดตามบั๊ก: https://github.com/PCRE2Project/pcre2/issues
- การจับคู่รูปแบบโดยใช้ Regular Expressions (2 มีนาคม 2010) โดย Nick Maclaren และ Philip Hazel: https://www-uxsup.csx.cam.ac.uk/courses/moved.REs/paper.pdf
- pcre 8.43 (2019-04) - Windows Cygwin x86-64: https://www-uxsup.csx.cam.ac.uk/pub/windows/cygwin/x86_64/release/pcre/
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ นิพจน์ปกติที่เข้ากันได้กับ Perl
Perl Compatible Regular Expressions ( PCRE ) เป็น ไลบรารี ที่เขียนด้วยภาษา C ซึ่งใช้ กลไก นิพจน์ปกติ ที่ได้รับแรงบันดาลใจจากความสามารถของ ภาษาโปรแกรม Perl Philip Hazel เริ่มเขียน...
การสนับสนุนคอมไพเลอร์แบบทันเวลาพอดี
สามารถเปิดใช้งานคอมไพเลอร์แบบทันที ( just-in-time compiler) ได้เมื่อสร้างไลบรารี PCRE2 ประโยชน์ด้านประสิทธิภาพที่สำคัญสามารถเกิดขึ้นได้เมื่อ (ตัวอย่างเช่น) โปรแกรมที่เรียกใช้งานคุณสมบัตินี้ร่วมกับรูปแบบที่เข้ากันได้ซึ่งถูกเรียกใช้งานซ้ำๆ...
การจัดการหน่วยความจำที่ยืดหยุ่น
การใช้สแต็กของระบบสำหรับการย้อนกลับอาจก่อให้เกิดปัญหาใน PCRE1 ซึ่งเป็นเหตุผลที่ฟีเจอร์นี้ถูกเปลี่ยนแปลงใน PCRE2 ปัจจุบันมีการใช้ฮีปเพื่อจุดประสงค์นี้แทน และสามารถจำกัดปริมาณรวมได้ ปัญหา สแต็กโอเวอร์โฟลว์ ซึ่งเกิดขึ้นบ่อยครั้งใน PCRE1 ไม่เป็นปัญหาอีกต่อไปใน...
กฎการหลบหนีที่สอดคล้องกัน
เช่นเดียวกับ Perl, PCRE2 มีกฎการหลีกเลี่ยงอักขระที่สม่ำเสมอ: อักขระที่ไม่ใช่ตัวอักษรและตัวเลขใดๆ สามารถหลีกเลี่ยงให้มีความหมายตามตัวอักษรได้โดยการใส่เครื่องหมาย \ แบ็กสแลช (\) ไว้ข้างหน้าอักขระนั้น อักขระตัวอักษรและตัวเลขใดๆ...