Regex (นิพจน์ปกติ) คืออะไร

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

เมื่อพยายามเข้าใจนิพจน์ทั่วไปครั้งแรกดูเหมือนว่าจะเป็นภาษาอื่น อย่างไรก็ตามการจัดทำนิพจน์ทั่วไปสามารถช่วยให้คุณประหยัดเวลาหลายพันชั่วโมงหากคุณทำงานกับข้อความหรือต้องแยกวิเคราะห์ข้อมูลจำนวนมาก ด้านล่างนี้เป็นตัวอย่างของนิพจน์ทั่วไปที่มีส่วนประกอบของแต่ละรายการ นิพจน์ทั่วไปนี้จะแสดงในตัวอย่างการเขียนโปรแกรม Perl ที่แสดงในภายหลังในหน้านี้

พื้นฐานของการแสดงออกปกติ (แผ่นโกง)

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

ตัวละครมันทำอะไร?ตัวอย่างไม้ขีด
^ตรงกับจุดเริ่มต้นของบรรทัด^ abcabc, abcdef .., abc123
$ตรงกับจุดสิ้นสุดของบรรทัดabc $ของฉัน: abc, 123abc, theabc
.ตรงกับตัวละครใด ๆไฟฟ้ากระแสสลับabc, asg, a2c
|หรือผู้ประกอบการabc | xyzabc หรือ xyz
( ... )จับภาพทุกสิ่งที่ตรงกัน(ก) ข (c)จับ 'a' และ 'c'
(? ... )กลุ่มที่ไม่ได้จับภาพ(ก) ข (? c)จับ 'a' แต่เฉพาะกลุ่ม 'c'
[ ... ]ตรงกับสิ่งที่อยู่ในวงเล็บ[abc]a, b หรือ c
[^ ... ]จับคู่สิ่งที่ไม่มีอยู่ในวงเล็บ[^ abc]xyz, 123, 1de
[az]จับคู่อักขระใด ๆ ระหว่าง 'a' และ 'z'[BZ]bc, จิตใจ, xyz
{x}จำนวน 'x' ที่แน่นอนในการจับคู่(ABC) {2}abcabc
{x}จับคู่ 'x' จำนวนครั้งหรือมากกว่า(ABC) {2}abcabc, abcabcabc
{x, y}จับคู่กันระหว่าง 'x' และ 'y' ครั้ง(ก) {2, 4}aa, aaa, aaaaa
* * * *การแข่งขันโลภที่ตรงกับทุกอย่างในสถานที่ของ *AB * คabc, abbcc, abcdc
+จับคู่อักขระก่อน + หนึ่งครั้งขึ้นไปA + Cac, aac, aaac,
?ตรงกับตัวละครก่อนหน้า? ศูนย์หรือหนึ่งครั้ง นอกจากนี้ยังใช้เป็นการแข่งขันที่ไม่โลภAB? Cac, abc
\หลบหนีตัวละครหลังจากแบ็กสแลชหรือสร้างลำดับการหลบหนีเป็น \ SCไฟฟ้ากระแสสลับ

ตัวละครหนี (ลำดับหนี)

หมายเหตุ: อักขระเลี่ยงจะคำนึงถึงขนาดตัวพิมพ์

ตัวละครมันทำอะไร?
\อักขระใด ๆ ที่ไม่ได้กล่าวถึงด้านล่างนำหน้าด้วย \ จะถูกหลบหนี ตัวอย่างเช่น, \. จับคู่จุดและไม่ทำหน้าที่ดังกล่าวข้างต้น อักขระที่ควรหลีกเลี่ยงคือ () [] {} ^ $ | * +? \
\ 0อักขระ Null
\ aตรงกับเสียงระฆังหรือสัญญาณเตือน
\ ขขอบเขตของ Word ในเกือบหรือ backspace
\ Bขอบเขตของคำที่ไม่ใช่
\ dตรงกับหลักทศนิยมใด ๆ (0-9)
\ Dจับคู่ที่ไม่ใช่ตัวเลขใด ๆ
\ Eตรงกับการหลบหนี
\ ฉจับคู่ฟีดฟอร์ม
\ nตรงกับบรรทัดใหม่
\ Q ... \ Eละเว้นความหมายพิเศษใด ๆ ในสิ่งที่กำลังจับคู่
\ rตรงกับการคืนรถ
\ sจับคู่อักขระช่องว่าง (เว้นวรรค, \ t, \ r, \ n)
\ Sจับคู่อักขระช่องว่างที่ไม่ใช่สีขาว
\ tจับคู่แท็บ
\ วีจับคู่แท็บแนวตั้ง
w \จับคู่อักขระคำใดคำหนึ่ง [a-zA-Z_0-9]
\ Wจับคู่อักขระที่ไม่ใช่คำใดคำหนึ่ง

ธงการแสดงออกปกติ

นอกแฟล็กนิพจน์ทั่วไป (ตอนจบ) สามารถใช้เพื่อช่วยในการจับคู่รูปแบบ

ตัวละครมันทำอะไร?
ผมไม่สนใจเคส (อนุญาตให้ใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก)
ม.การแข่งขันแบบหลายสาย
sตรงกับบรรทัดใหม่
xอนุญาตช่องว่างและความคิดเห็น
Jอนุญาตชื่อกลุ่มซ้ำ
ยูUngreedy match

ตัวอย่างภาษานิพจน์ปกติของการเขียนโปรแกรม Perl

ด้านล่างนี้เป็นตัวอย่างของการแสดงผลปกติและการจับคู่รูปแบบใน Perl ตัวอย่างเหล่านี้จำนวนมากมีความคล้ายคลึงหรือคล้ายกับภาษาการเขียนโปรแกรมและโปรแกรมอื่นที่สนับสนุนนิพจน์ทั่วไป

 $ data = ~ s / ข้อมูลไม่ดี / ข้อมูลที่ดี / i; 

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

 $ data = ~ s / a / A /; 

ตัวอย่างนี้แทนที่ a ตัวพิมพ์เล็กใด ๆ ด้วยตัวพิมพ์ใหญ่ A ดังนั้นหากข้อมูล $ เป็น "ตัวอย่าง" มันจะกลายเป็น "exAmple"

 $ data = ~ s / [az] / * /; 

ตัวอย่างข้างต้นแทนที่ตัวอักษรตัวเล็กใด ๆ a ถึง z ด้วยเครื่องหมายดอกจัน ดังนั้นถ้าข้อมูล $ เป็น "ตัวอย่าง" มันจะกลายเป็น "E ******"

 $ data = ~ s / e $ / es /; 

ตัวอย่างนี้ใช้อักขระ $ ซึ่งจะบอกให้นิพจน์ทั่วไปจับคู่ข้อความก่อนหน้าในตอนท้ายของสตริง ดังนั้นถ้าข้อมูล $ เป็น "ตัวอย่าง" มันจะกลายเป็น "ตัวอย่าง"

 $ data = ~ s /\./!/; 

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

 $ data = ~ s / ^ e / E /; 

ในตัวอย่างข้างต้นตัวอย่างคาเร็ต (^) บอกให้นิพจน์ทั่วไปจับคู่อะไรก็ได้ที่จุดเริ่มต้นของบรรทัด ในตัวอย่างนี้สิ่งนี้จะจับคู่ตัวพิมพ์เล็กใด ๆ ที่จุดเริ่มต้นของบรรทัดและแทนที่ด้วยตัวพิมพ์ใหญ่ E ดังนั้นหาก $ data เป็น "ตัวอย่าง" มันจะกลายเป็น "ตัวอย่าง"

เคล็ดลับ: หากคุณต้องการสำรวจนิพจน์ทั่วไปยิ่งขึ้นในคำสั่งเช่น grep หรือนิพจน์ทั่วไปในภาษาของการเขียนโปรแกรมให้ดูที่หนังสือ O'Reilly "Mastering regular expressions"

ตัวย่อของคอมพิวเตอร์, ลำดับการหลีกเลี่ยง, การแสดงออก, Glob, ตัวละคร Meta, เงื่อนไขการเขียนโปรแกรม, Tilde, Wildcard