นิพจน์ทั่วไป (พร้อมตัวอย่าง) - 1

"และตอนนี้ ฉันจะบอกคุณเกี่ยวกับ Regular Expression หัวข้อนี้ทั้งซับซ้อนและเรียบง่ายในเวลาเดียวกัน หากต้องการเข้าใจ Regular Expression อย่างถ่องแท้ คุณอาจต้องอ่านหนังสือหนักๆ สองหรือสามเล่ม แต่ฉันสามารถสอนวิธีใช้พวกมันได้ ตอนนี้."

"โปรแกรมเมอร์ที่มีประสบการณ์ชอบพูดเล่นถ้าคุณมีปัญหาและคิดว่าจะแก้ปัญหาด้วย Regular Expression ตอนนี้คุณมีสองปัญหา"

"อืม."

“ฉันหวังว่าฉันจะไม่ทำให้นายตกใจมากเกินไปนะเพื่อน ไม่นะ?”

"โอเค ดี หัวข้อใหม่ของเราคือ Regular Expression"

"ถ้าเราลดความซับซ้อนมากเกินไป นิพจน์ทั่วไปจะเป็นรูปแบบสำหรับสตริง"

"คุณสามารถตรวจสอบว่าสตริงตรงกับรูปแบบที่กำหนดหรือไม่คุณยังสามารถแยกสตริงออกเป็นส่วนๆ โดยใช้ตัวคั่นหรือรูปแบบ"

"แต่ขอเริ่มด้วยสิ่งง่ายๆ: รูปแบบคืออะไร "

"ใน SQL (แต่ไม่ใช่ใน Java) คุณสามารถตรวจสอบว่าสตริงตรงกับรูปแบบใดรูปแบบหนึ่งหรือไม่ นี่คือลักษณะที่ปรากฏ:"

name like 'Alex%'

นี่คือชื่อตัวแปร เช่น เป็นคำสั่งสำหรับตรวจสอบรูปแบบ และ "Alex%" เป็นรูปแบบ

ในกรณีนี้ % หมายถึงสตริงหรือสตริงย่อยใดๆ

ลวดลาย สตริงที่ตรงกับรูปแบบ
'อเล็กซ์%' อเล็กซ์
อเล็กซ์ andr
อเล็กซ์ ander
อเล็กซ์ andra
….
'%x%' Ma x
Ma x im
Ale x andr
'%ก' Olg a
Helen a
Ir a

"ใน SQL หากคุณต้องการระบุว่าควรมีอักขระอื่นเพียงตัวเดียว คุณควรใช้อักขระขีดล่าง: "_"

ลวดลาย สตริงที่ตรงกับรูปแบบ
'อเล็กซ์%_' อเล็กซ์
อเล็กซ์ andr
อเล็กซ์ ander
อเล็กซ์ andra
….
'_x' ขวาน
Bx
Cx
'___' อ้า
อ้า บ
บบบบ

"นั่นสมเหตุสมผลแล้ว"

"เอาล่ะ ต่อไปเราจะใช้นิพจน์ทั่วไป"

"โดยปกตินิพจน์ทั่วไปจะมีการจำกัดไม่เพียงแต่จำนวนอักขระเท่านั้น แต่ยังรวมถึง 'เนื้อหา' ด้วย "มาสก์ใดๆ มักจะประกอบด้วยสองส่วน (บางครั้งอาจมากกว่านั้น): ส่วนแรกอธิบายถึง 'การตั้งค่า' ของอักขระ และส่วนที่สองอธิบายถึงจำนวนอักขระ "

"นี่คือ ตัวอย่าง เนื้อหา บางส่วน :"

ลวดลาย คำอธิบาย ตัวอย่าง
. ตัวละครใดตัวละครหนึ่ง 1
\d ตัวเลขใดก็ได้ 7
\D ที่ไม่ใช่ตัวเลข
\s ช่องว่าง ตัวแบ่งบรรทัด หรืออักขระแท็บ ' '
\S ทุกอย่างยกเว้นช่องว่าง แท็บ และตัวแบ่งบรรทัด
[แอซ] ตัวอักษรใด ๆ จาก a ถึง z ซี
[0-9] ตัวเลขใดก็ได้ตั้งแต่ 0 ถึง 9 8
\w ตัวอักษรคำใดก็ได้
\ว อักขระที่ไม่ใช่คำใดๆ _

"ฉันจะจำสิ่งเหล่านั้นไม่ได้ แต่มันก็ดูไม่ยากเกินไป"

"ดีมาก ต่อไปนี้คือตัวอย่างจำนวนอักขระในหน้ากาก: "

ลวดลาย คำอธิบาย ตัวอย่าง
เอ? อักขระ 'A' เกิดขึ้นเพียงครั้งเดียวหรือไม่มีเลย
บี+ อักขระ 'B' เกิดขึ้นอย่างน้อยหนึ่งครั้ง บีบีบี
ค* อักขระ 'C' เกิดขึ้นตั้งแต่ศูนย์ครั้งขึ้นไป ซี.ซี.ซี
ดี{n} อักขระ 'D' เกิดขึ้น n ครั้ง รูปแบบ D{4} ตรงกับ DDDD
เ{n,} อักขระ 'E' เกิดขึ้น n ครั้งขึ้นไป รูปแบบ E{2,} ตรงกับ EEEEEEE
ฟ{n,m} อักขระ 'F' เกิดขึ้นระหว่าง n และ m ครั้ง รูปแบบ E{2,4} ตรงกับ EEEE

"ทั้งหมดนั้นดูค่อนข้างตรงไปตรงมา"

"คุณกำลังไล่ตามทุกอย่างอย่างรวดเร็ว ตอนนี้เรามาดูกันว่าภาพรวมเป็นอย่างไร:"

ลวดลาย คำอธิบาย ตัวอย่าง
[โฆษณา]? อักขระระหว่าง 'a' และ 'd' เกิดขึ้นเพียงครั้งเดียวหรือไม่เกิดขึ้นเลย เอบีซีดี
[bd,z]+ อักขระ 'b', 'c', 'd' หรือ 'z' เกิดขึ้นอย่างน้อยหนึ่งครั้ง ข, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* ตัวเลข 1, 7, 8 หรือ 9 เกิดขึ้นตั้งแต่ศูนย์ครั้งขึ้นไป 1, 7, 9, 9777, 111199
1{5} หลัก 1 เกิดขึ้น 5 ครั้ง 11111
[1,2,ก,ข]{2} สัญลักษณ์ 1, 2, 'a' หรือ 'b' เกิดขึ้นสองครั้ง 11, 12, 1a, ab, 2b, bb, 22
[ก,0]{2,3} สัญลักษณ์ 'a' หรือ 0 เกิดขึ้น 2 หรือ 3 ครั้ง aa, a0,00,0a, aaa,000, a00,0a0, a0a

"ยังคงชัดเจนทั้งหมด"

“จริงเหรอ อืม ไม่ว่าฉันจะอธิบายทุกอย่างดีหรือไม่ก็คุณเข้าใจเร็วเกินไป เอาล่ะ นั่นก็เป็นเรื่องดีสำหรับเรา”

"นี่คือข้อมูลเชิงลึกใหม่สองสามข้อสำหรับคุณ"

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

"^ หมายความว่าสตริงย่อยต้องมีจุดเริ่มต้นของสตริง"

"$ หมายความว่าสตริงย่อยต้องมีจุดสิ้นสุดของสตริง"

"นี่คือตัวอย่างบางส่วน:"

ลวดลาย สตริงและสตริงย่อยที่ตรงกับรูปแบบ
ก{3} อ๊าาาาาาาาาาาาาา  _  _  _  _
{3}$ อ๊าาาาาาาาาาาาาา  _
^a{3} อ๊าาาาาาาาาาาาาา  _
^a{3}$ อ๊าาาาาาาาาาาาาา

"และอีกหนึ่งจุดสำคัญ"

"ในนิพจน์ทั่วไป อักขระต่อไปนี้มีความหมายพิเศษ: [ ] \ / ^ $ . | ? * + ( ) { } อักขระเหล่านี้เรียกว่าอักขระควบคุม ดังนั้นคุณไม่สามารถใช้อักขระเหล่านี้ในสตริงได้"

"เช่นเดียวกับในโค้ด Java พวกเขาจะต้องหนี "และเช่นเดียวกับในโค้ด Java จะใช้อักขระ '\' สำหรับสิ่งนี้"

"ถ้าเราต้องการอธิบายสตริงที่ประกอบด้วย '?' สามตัว อักขระ เราไม่สามารถเขียน '?{3}' ได้ เนื่องจาก '?' เป็นอักขระควบคุม เราต้องทำดังนี้: \?{3} ถ้าเราต้องการใช้อักขระ '\' เราก็จำเป็นต้องเขียน '\\'"

"ตกลง เข้าใจแล้ว"

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

"แน่นอน."

"ดังนั้น หากคุณพยายามกำหนดนิพจน์ทั่วไปของ Java ในสตริง คุณต้องหลีกอักขระ '\' สองครั้ง"

"นี่คือตัวอย่าง:"

ฉันต้องการหน้ากากที่ตรงกับ 'c:\anything'
ในทางทฤษฎี นิพจน์ทั่วไปควรมีลักษณะดังนี้:
อักขระ 'c' หนึ่งตัว
ทวิภาค แบ็
กสแลช
จุด และเครื่องหมายดอกจัน (เพื่อแสดงอักขระจำนวนเท่าใดก็ได้) ฉันเพิ่มช่องว่างเพื่อปรับปรุงการอ่าน:
c : \ .*
แต่อักขระ '\' และ '.' ต้องหนี ดังนั้นนิพจน์ทั่วไปจะมีลักษณะดังนี้:
c :   \\ \ *
หรือไม่มีช่องว่าง
c: \\ \ *
"เราควรมีแบ็กสแลชสามตัวใน Regular Expression
นั่นหมายความว่าในไฟล์ Java นิพจน์ทั่วไปจะมีลักษณะดังนี้:"
String regexp = "c: \\\\ \\. *";

"ว้าว! โอ้ ตอนนี้ฉันรู้แล้ว"

"และถ้าคุณตัดสินใจที่จะเจาะลึกลงไปกว่านี้ ต่อไปนี้คือลิงค์ดีๆ 2-3 ลิงค์:"

บทเรียนในวิกิพีเดีย