รู้ว่ารสชาติของคุณ 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 รวมทั้งการเปลี่ยนแปลงกรณีและเงื่อนไข อันหลังนั้นมีเอกลักษณ์ในการเพิ่มพลังเท่าที่ฉันรู้