รู้ว่ารสชาติของคุณ regex
มีผู้คนจำนวนมากที่คิดว่าการแสดงออกปกตินั้นไม่เชื่อเรื่องภาษา อย่างไรก็ตามจริงๆแล้วมันมีความแตกต่างค่อนข้างมากระหว่างรสชาติและโดยเฉพาะอย่างยิ่งสำหรับการตีกอล์ฟมันเป็นการดีที่จะรู้ว่ามันมีอะไรบ้างและคุณสมบัติที่น่าสนใจเพื่อให้คุณสามารถเลือกสิ่งที่ดีที่สุดสำหรับแต่ละงาน นี่คือภาพรวมของรสชาติที่สำคัญหลายประการและสิ่งที่ทำให้แตกต่างจากรสชาติอื่น ๆ (รายการนี้ไม่สมบูรณ์จริง ๆ แต่ให้ฉันรู้ถ้าฉันพลาดบางสิ่งบางอย่างที่จ้องมองจริงๆ)
Perl และ PCRE
ฉันกำลังโยนสิ่งเหล่านี้ลงในหม้อใบเดียวเนื่องจากฉันไม่คุ้นเคยกับรสชาติ Perl และพวกเขาส่วนใหญ่เทียบเท่ากัน (PCRE ใช้สำหรับการแสดงผลปกติที่เข้ากันได้กับ Perl) ข้อได้เปรียบหลักของรสชาติ Perl คือคุณสามารถเรียกรหัส Perl ได้จากภายใน regex และการทดแทน
- recursion / ซับรูทีน อาจเป็นคุณลักษณะที่สำคัญที่สุดสำหรับการเล่นกอล์ฟ (ซึ่งมีอยู่ในสองรสชาติเท่านั้น)
(?(group)yes|no)รูปแบบตามเงื่อนไข
- รองรับการเปลี่ยนแปลงของคดีในสตริงทดแทนด้วย
\l, \u, และ\L\U
- PCRE อนุญาตให้มีการสลับใน lookbehinds ซึ่งแต่ละทางเลือกสามารถมีความยาวแตกต่างกัน (แต่คงที่) (รสชาติส่วนใหญ่รวมถึง Perl ต้องใช้ lookbehinds เพื่อให้มีความยาวคงที่โดยรวม)
\G เพื่อยึดการแข่งขันให้สิ้นสุดการแข่งขันก่อนหน้า
\K เพื่อรีเซ็ตการเริ่มต้นของการแข่งขัน
- PCRE สนับสนุนทั้งUnicode คุณสมบัติตัวอักษรและสคริปต์
\Q...\Eเพื่อหลีกเลี่ยงการวิ่งของตัวละครอีกต่อไป มีประโยชน์เมื่อคุณพยายามจับคู่สตริงที่มีอักขระเมตาจำนวนมาก
.สุทธิ
นี่อาจเป็นรสชาติที่ทรงพลังที่สุดโดยมีข้อบกพร่องเพียงเล็กน้อยเท่านั้น
ข้อบกพร่องที่สำคัญอย่างหนึ่งในแง่ของการเล่นกอล์ฟก็คือมันไม่รองรับปริมาณที่เป็นเจ้าของเช่นรสชาติอื่น ๆ แทนการที่คุณจะต้องเขียน.?+(?>.?)
ชวา
- เนื่องจากข้อผิดพลาด (ดูภาคผนวก) Java รองรับประเภท lookbehind ความยาวตัวแปรที่ จำกัด : คุณสามารถดูตลอดทางจนถึงจุดเริ่มต้นของสตริงด้วย
.*จากที่ที่คุณสามารถเริ่ม lookahead เช่น(?<=(?=lookahead).*)นี้
- รองรับการรวมและแยกส่วนของคลาสอักขระ
- มีการสนับสนุนอย่างกว้างขวางมากที่สุดสำหรับ Unicode กับตัวละครคลาสสำหรับ"สคริปต์ Unicode บล็อกประเภทและคุณสมบัติไบนารี"
\Q...\E เช่นเดียวกับใน Perl / PCRE
ทับทิม
ในรุ่นล่าสุดรสชาตินี้มีประสิทธิภาพเช่นเดียวกับ PCRE รวมถึงการรองรับการเรียกรูทีนย่อย เช่นเดียวกับ Java มันยังสนับสนุนการรวมและแยกส่วนของคลาสอักขระ คุณสมบัติพิเศษอย่างหนึ่งคือคลาสอักขระในตัวสำหรับเลขฐานสิบหก: \h(และเมื่อตะกี้\H)
คุณลักษณะที่มีประโยชน์ที่สุดสำหรับการเล่นกอล์ฟคือวิธีที่ Ruby จัดการปริมาณ ที่สะดุดตาที่สุดคือความเป็นไปได้ที่จะสร้างรังของปริมาณโดยไม่มีวงเล็บ .{5,7}+ทำงาน.{3}?ได้ดี นอกจากนี้เมื่อเทียบกับรสชาติอื่น ๆ ส่วนใหญ่ถ้าผูกพันลดลงในปริมาณคือ0มันสามารถละเว้นเช่นเทียบเท่ากับ.{,5}.{0,5}
สำหรับรูทีนย่อยความแตกต่างที่สำคัญระหว่างรูทีนย่อยของ PCRE กับรูทีนย่อยของรูบี้ก็คือไวยากรณ์ของรูบี้นั้นเป็นไบต์ที่ยาวกว่า(?n)และ\g<n>มีรูทีนย่อยของรูบี้ แต่สามารถใช้รูทีนย่อยของรูบี้ได้
ในที่สุดทับทิมมีความหมายที่แตกต่างกันสำหรับตัวดัดแปลงที่เกี่ยวข้องกับสายกว่ารสชาติอื่น ๆ ส่วนใหญ่ โมดิฟายเออร์ที่มักจะเรียกmในรสชาติอื่น ๆ จะเปิดอยู่เสมอใน Ruby ดังนั้น^และ$ตรงกับจุดเริ่มต้นและจุดสิ้นสุดของสายเสมอไม่ใช่แค่จุดเริ่มต้นและจุดสิ้นสุดของสตริง วิธีนี้จะช่วยให้คุณประหยัดไบต์ได้หากคุณต้องการพฤติกรรมนี้ แต่มันจะทำให้คุณต้องเสียค่าใช้จ่ายเป็นไบต์เพิ่มเติมหากคุณไม่ต้องการเพราะคุณจะต้องแทนที่^และแทนที่$ด้วย\Aและ\zตามลำดับ นอกจากนั้นตัวดัดแปลงที่มักจะเรียกว่าs(ซึ่งทำให้การ.จับคู่ linefeeds) ถูกเรียกmใน Ruby แทน สิ่งนี้จะไม่ส่งผลกระทบต่อจำนวนไบต์ แต่ควรจำไว้เพื่อหลีกเลี่ยงความสับสน
หลาม
Python มีรสชาติที่ดี แต่ฉันไม่ได้ตระหนักถึงคุณสมบัติที่มีประโยชน์อย่างยิ่งที่คุณจะไม่พบในที่อื่น
อย่างไรก็ตามมีรสชาติทางเลือกซึ่งมีวัตถุประสงค์เพื่อแทนที่reโมดูลในบางจุดและซึ่งมีคุณสมบัติที่น่าสนใจมากมาย นอกเหนือจากการเพิ่มการสนับสนุนสำหรับการเรียกซ้ำ lookbehinds ตัวแปรที่มีความยาวรวมกันและผู้ประกอบการชั้นตัวก็ยังมีคุณสมบัติที่เป็นเอกลักษณ์ของการจับคู่เลือน ในสาระสำคัญคุณสามารถระบุจำนวนข้อผิดพลาด (การแทรกการลบการแทนที่) ซึ่งได้รับอนุญาตและเครื่องยนต์จะให้การแข่งขันโดยประมาณ
ECMAScript
รสชาติ ECMAScript มี จำกัด มากและไม่ค่อยมีประโยชน์สำหรับการเล่นกอล์ฟมากนัก สิ่งเดียวที่จะเกิดขึ้นกับมันคือคลาสอักขระว่างเมื่อตะกี้ [^]เพื่อจับคู่อักขระใด ๆ และคลาสอักขระว่างเปล่าที่ล้มเหลวโดยไม่มีเงื่อนไข[](ตรงข้ามกับปกติ(?!)) แต่น่าเสียดายที่รสชาติไม่ได้มีคุณสมบัติใด ๆ ซึ่งทำให้หลังมีประโยชน์สำหรับปัญหาปกติ
Lua
Lua มีรสชาติที่เป็นเอกลักษณ์ของตัวเองซึ่งค่อนข้าง จำกัด (เช่นคุณไม่สามารถหาจำนวนกลุ่มได้) แต่มาพร้อมกับคุณสมบัติที่มีประโยชน์และน่าสนใจจำนวนหนึ่ง
- มีชวเลขเป็นจำนวนมากสำหรับคลาสของอักขระในตัวรวมถึงเครื่องหมายวรรคตอนอักขระตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กและเลขฐานสิบหก
- ด้วย
%bมันรองรับไวยากรณ์ขนาดกะทัดรัดมากเพื่อให้ตรงกับสตริงที่สมดุล เช่น%b()จับคู่ a (และจากนั้นทุกอย่างจนถึงการจับคู่)(ข้ามคู่จับคู่ด้านในอย่างถูกต้อง) (และ)สามารถเป็นอักขระสองตัวที่นี่
การส่งเสริม
รสชาติ Regex ของ Boostเป็นหลักของ Perl แต่ก็มีคุณสมบัติใหม่บางอย่างดีเพื่อทดแทน regex รวมทั้งการเปลี่ยนแปลงกรณีและเงื่อนไข อันหลังนั้นมีเอกลักษณ์ในการเพิ่มพลังเท่าที่ฉันรู้