ต้นฉบับของบทความนี้
อยู่ที่นี่ อาจไม่มีทฤษฎีใดที่มากเกินไป และฉันจะให้ลิงก์หลายรายการไปยังเนื้อหาที่มีรายละเอียดเพิ่มเติมเกี่ยวกับ regex ในตอนท้ายของบทความ แต่สำหรับฉันดูเหมือนว่าการเริ่มเจาะลึกหัวข้อเช่นนิพจน์ทั่วไปจะน่าสนใจกว่านี้มากหากมีโอกาสที่ไม่เพียงแต่อัดแน่นเท่านั้น แต่ยังรวบรวมความรู้ได้ทันทีโดยทำงานเล็ก ๆ ให้สำเร็จไปพร้อมกัน
มาเริ่มกันเลย. โดยทั่วไปแล้วฝ่ายตรงข้ามของการใช้นิพจน์ทั่วไป ('RegEx' หรือเพียงแค่ 'regex') ในการเขียนโปรแกรมอ้างอิงคำพูดต่อไปนี้ซึ่งมาจาก Jamie Zawinski:
"บางคนเมื่อประสบปัญหาคิดว่า 'ฉันรู้ ฉันจะใช้นิพจน์ทั่วไป .'" ตอนนี้พวกเขามีปัญหาสองประการ" ที่จริงแล้ว การใช้นิพจน์ทั่วไปยังไม่ใช่ความคิดที่ดีหรือไม่ดี และสิ่งนี้ในตัวมันเองจะไม่เพิ่มปัญหาและจะไม่แก้ปัญหาใด ๆ มันเป็นเพียงเครื่องมือ และวิธีที่คุณใช้ (ถูกหรือผิด) จะเป็นตัวกำหนดผลลัพธ์ที่คุณจะเห็น ตัวอย่างเช่น หากคุณพยายามใช้ regex เพื่อสร้างโปรแกรมแยกวิเคราะห์ HTML คุณมักจะประสบ
ปัญหา แต่ถ้าคุณเพียงต้องการแยก เช่น การประทับเวลาจากบางแถว คุณก็อาจจะสบายดี เพื่อให้คุณเชี่ยวชาญนิพจน์ทั่วไปได้ง่ายขึ้น ฉันได้รวบรวมบทเรียนนี้ซึ่งจะช่วยให้คุณเชี่ยวชาญนิพจน์ทั่วไปตั้งแต่เริ่มต้นในขั้นตอนสั้นๆ เพียง 20 ขั้นตอน บทช่วยสอนนี้มุ่งเน้นไปที่แนวคิดพื้นฐานของนิพจน์ทั่วไปเป็นหลัก และเจาะลึกหัวข้อขั้นสูงเพิ่มเติมเท่าที่จำเป็นเท่านั้น
ขั้นตอนที่ 1: เหตุใดจึงต้องใช้นิพจน์ทั่วไป
นิพจน์ทั่วไปใช้เพื่อค้นหารายการที่ตรงกันในข้อความโดยใช้รูปแบบ (รูปแบบ) ที่ระบุ เมื่อใช้ regex เราสามารถแยก
คำ ออก จากข้อความ รวมถึงอักขระตัวอักษรและเมตาแต่ละตัว รวมถึงลำดับที่ตรงตามเกณฑ์ที่กำหนดได้อย่าง ง่ายดายและง่ายดาย
นี่คือสิ่งที่ Wikipedia บอกเราเกี่ยวกับสิ่งเหล่านี้ :
นิพจน์ทั่วไปเป็นภาษาทางการสำหรับการค้นหาและจัดการสตริงย่อยในข้อความ โดยอิงตามการใช้อักขระเมตา (อักขระตัวแทน) สำหรับการค้นหา จะใช้สตริงตัวอย่าง (รูปแบบภาษาอังกฤษในภาษารัสเซีย มักเรียกว่า "เทมเพลต", "มาสก์") ซึ่งประกอบด้วยสัญลักษณ์และสัญลักษณ์เมตา และการกำหนดกฎการค้นหา ในการจัดการข้อความ จะมีการระบุสตริงการแทนที่เพิ่มเติม ซึ่งอาจประกอบด้วยอักขระพิเศษได้เช่นกัน รูปแบบอาจเรียบง่ายเหมือนกับคำ
dog
ในประโยคนี้:
สุนัขจิ้งจอกสีน้ำตาลที่รวดเร็วกระโดดข้ามสุนัขขี้เกียจ
นิพจน์ทั่วไปนี้มีลักษณะดังนี้:
สุนัข
...ง่ายพอแล้วใช่ไหมล่ะ? รูปแบบนี้อาจเป็นคำใดก็ได้ที่มีตัวอักษร
o
ด้วย นิพจน์ทั่วไปเพื่อค้นหารูปแบบดังกล่าวอาจมีลักษณะดังนี้:
\ ว้าว*
(
คุณสามารถลองใช้นิพจน์ทั่วไปนี้ได้ที่นี่ ) คุณจะสังเกตเห็นว่าเมื่อข้อกำหนด "การจับคู่" มีความซับซ้อนมากขึ้น นิพจน์ทั่วไปก็จะซับซ้อนมากขึ้นด้วย มีรูปแบบเพิ่มเติมสำหรับการระบุกลุ่มอักขระและรูปแบบการซ้ำที่ตรงกัน ซึ่งฉันจะอธิบายด้านล่าง แต่ทันทีที่เราพบรูปแบบที่ตรงกับข้อความบางข้อความ แล้วเราจะทำอย่างไรกับรูปแบบนั้น? เอ็นจิ้นนิพจน์ทั่วไปสมัยใหม่ช่วยให้คุณสามารถแยกอักขระหรือลำดับของอักขระ (สตริงย่อย) ออกจากข้อความที่มีอยู่ หรือลบออก หรือแทนที่ด้วยข้อความอื่น โดยทั่วไป นิพจน์ทั่วไปใช้ในการแยกวิเคราะห์และจัดการข้อความ ตัวอย่างเช่น เราสามารถแยกสตริงย่อยที่ดูเหมือนที่อยู่ IP แล้วลองตรวจสอบดู หรือเราสามารถแยกชื่อและที่อยู่อีเมลและจัดเก็บไว้ในฐานข้อมูลได้ หรือใช้นิพจน์ทั่วไปเพื่อค้นหาข้อมูลที่ละเอียดอ่อน (เช่น หมายเลขหนังสือเดินทางหรือหมายเลขโทรศัพท์) ในอีเมล และแจ้งเตือนผู้ใช้ว่าพวกเขาอาจทำให้ตัวเองตกอยู่ในความเสี่ยง Regex เป็นเครื่องมืออเนกประสงค์อย่างแท้จริงที่เรียนรู้ได้ง่ายแต่ยากที่จะเชี่ยวชาญ:
“การเล่นดนตรีได้ดีกับการสร้างเพลงมีความแตกต่างระหว่างการรู้จักสำนวนปกติกับการทำความเข้าใจมัน” - Jeffrey E.F. Friedl, การเรียนรู้นิพจน์ทั่วไป
ขั้นตอนที่ 2: วงเล็บเหลี่ยม[]
นิพจน์ทั่วไปที่ง่ายที่สุดที่เข้าใจได้ง่ายคือนิพจน์ทั่วไปที่มองหาการจับคู่อักขระต่ออักขระระหว่างรูปแบบนิพจน์ทั่วไปและสตริงเป้าหมาย ตัวอย่างเช่น ลองหาแมว:
รูปแบบ: แมว
เชือก: แมวถูกตัดตอนวิ่งใต้ท้องรถ
ตรงกัน: ^^^
(
วิธีการทำงานในทางปฏิบัติ - ดูที่นี่ )
หมายเหตุ! วิธีแก้ปัญหาทั้งหมดจะถูกนำเสนอที่นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้เท่านั้น ในนิพจน์ทั่วไป เช่นเดียวกับในการเขียนโปรแกรมทั่วไป คุณสามารถแก้ไขปัญหาเดียวกันได้หลายวิธี อย่างไรก็ตาม นอกเหนือจากการเปรียบเทียบอักขระต่ออักขระที่เข้มงวดแล้ว เรายังสามารถระบุการจับคู่ทางเลือกอื่นโดยใช้วงเล็บเหลี่ยม:
รูปแบบ: ca[rt]
เชือก: แมวถูกตัดตอนวิ่งใต้ท้องรถ
ตรงกัน: ^^^ ^^^
(
วิธีการทำงาน ) การเปิดและปิดวงเล็บเหลี่ยมจะบอกเอ็นจิ้นนิพจน์ทั่วไปว่าควรตรงกับอักขระที่ระบุใดๆ แต่มีเพียงอักขระเดียวเท่านั้น นิพจน์ทั่วไปข้างต้นจะไม่พบ
cart
คำทั้งหมด เช่น แต่จะพบเพียงบางส่วนเท่านั้น:
รูปแบบ: ca[rt]
เชือก: แมวถูกตัดตอนที่วิ่งอยู่ใต้เกวียน
ตรงกัน: ^^^ ^^^
(
วิธีการทำงาน ) เมื่อคุณใช้วงเล็บเหลี่ยม คุณจะบอกให้เอ็นจิ้นนิพจน์ทั่วไปจับคู่อักขระตัวเดียวที่อยู่ในวงเล็บเท่านั้น เอ็นจิ้นค้นหาอักขระ
c
จากนั้นจึงค้นหาอักขระ
a
แต่ถ้าอักขระถัดไปไม่ใช่
r
หรือ
t
แสดงว่าไม่ใช่การจับคู่โดยสมบูรณ์ หากพบ
ca
แล้วอย่างใดอย่างหนึ่ง
r
หรือ
t
หยุด จะไม่พยายามจับคู่อักขระมากกว่านี้ เนื่องจากวงเล็บเหลี่ยมระบุว่าต้องจับคู่อักขระที่มีอยู่เพียงตัวเดียวเท่านั้น เมื่อพบ ก็จะ
ca
พบ
r
ในคำว่า next
cart
และหยุดเนื่องจากพบรายการที่ตรงกัน
car
แล้ว
วัตถุประสงค์การฝึกอบรม:
เขียนนิพจน์ทั่วไปที่ตรงกับรูปแบบทั้ง 10 รูปแบบ
had
ใน
Had
ข้อความที่ตัดตอนมาจากการเล่นคำที่ไม่สามารถแปลได้ในภาษาท้องถิ่นนี้:
ลวดลาย:
สตริง: Jim โดยที่ Bill มี"had"เคยมี"had had " “เคยมี”ถูกต้องแล้ว
ตรงกัน: ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^ ^^^
(
ดูวิธีแก้ปัญหาที่เป็นไปได้ ที่นี่ ) แล้วชื่อสัตว์ทั้งหมดในประโยคต่อไปนี้ล่ะ?
ลวดลาย:
เชือก: ค้างคาว แมวและหนูเดินเข้าไปในบาร์...
ตรงกัน: ^^^ ^^^ ^^^
(
วิธีแก้ไขที่เป็นไปได้ ) หรือง่ายกว่านั้น: ค้นหาคำ
bar
หรือ
bat
:
ลวดลาย:
เชือก: ค้างคาว แมวและหนูเดินเข้าไปในบาร์...
ตรงกัน: ^^^ ^^^
(
วิธีแก้ไขที่เป็นไปได้ ) ตอนนี้เราได้เรียนรู้วิธีการเขียนนิพจน์ทั่วไปที่ซับซ้อนไม่มากก็น้อยแล้ว และเราอยู่ในขั้นตอนที่ 2 เท่านั้น! มาต่อกัน!
ขั้นตอนที่ 3: ลำดับการหลบหนี
ในขั้นตอนที่แล้ว เราได้เรียนรู้เกี่ยวกับวงเล็บเหลี่ยม
[]
และวิธีที่วงเล็บช่วยเราค้นหารายการที่ตรงกันอื่นโดยใช้เครื่องมือ regex แต่ถ้าเราต้องการค้นหารายการที่ตรงกันในรูปแบบของวงเล็บเหลี่ยมเปิดและปิด
[]
ล่ะ เมื่อเราต้องการค้นหาการจับคู่คำแบบอักขระต่ออักขระ
cat
เราได้จัดเตรียมลำดับอักขระนี้ให้กับกลไก regex (
cat
) ลองหาวงเล็บเหลี่ยม
[]
ด้วยวิธีเดียวกัน:
รูปแบบ: []
สตริง: คุณไม่สามารถจับคู่ [] โดยใช้ regex ได้! คุณจะต้องเสียใจสิ่งนี้!
การแข่งขัน:
(
มาดูกันว่าเกิดอะไรขึ้น ) อย่างไรก็ตาม มีบางอย่างใช้งานไม่ได้... เนื่องจากอักขระในวงเล็บเหลี่ยมทำหน้าที่เป็นอักขระกลไก regex พิเศษที่มักใช้เพื่อระบุอย่างอื่น และไม่ใช่รูปแบบตามตัวอักษรที่จะจับคู่ด้วยตัวมันเอง ตามที่เราจำได้จากขั้นตอนที่ 2 จะใช้เพื่อค้นหารายการที่ตรงกันเพื่อให้กลไก regex สามารถจับคู่อักขระใดๆ ที่อยู่ระหว่างอักขระเหล่านั้นได้ หากคุณไม่ใส่อักขระใดๆ ไว้ระหว่างอักขระ อาจทำให้เกิดข้อผิดพลาดได้ เพื่อให้ตรงกับอักขระพิเศษเหล่านี้ เราต้องหลีกเลี่ยงอักขระเหล่านั้นโดยนำหน้าด้วยอักขระแบ็กสแล
\
ช แบ็กสแลช (หรือแบ็กสแลช) เป็นอักขระพิเศษอีกตัวหนึ่งที่บอกให้เอ็นจิ้น regex ค้นหาอักขระตัวถัดไปตามตัวอักษร แทนที่จะใช้เป็นอักขระเมตา เอ็นจิ้น regex จะค้นหาเฉพาะอักขระ
[
และ
]
หาก
ทั้งคู่นำหน้าด้วยแบ็กสแลช:
ลวดลาย: \[\]
สตริง: คุณไม่สามารถจับคู่ [] โดยใช้ regex ได้! คุณจะต้องเสียใจสิ่งนี้!
ตรงกัน: ^^
(
ลองดูว่าเกิดอะไรขึ้นในครั้งนี้ ) โอเค ถ้าเราต้องการหาแบ็กสแลชเองล่ะ? คำตอบนั้นง่าย เนื่องจากแบ็กสแลช
\
เป็นอักขระพิเศษ จึงจำเป็นต้องหลีกด้วย ยังไง? แบ็กสแลช!
ลวดลาย: \\
สตริง: C:\Users\Tanja\Pictures\Dogs
การแข่งขัน: ^ ^ ^ ^
(
ตัวอย่างเดียวกันในทางปฏิบัติ ) เฉพาะอักขระพิเศษเท่านั้นที่ต้องนำหน้าด้วยแบ็กสแลช อักขระอื่นๆ ทั้งหมดจะถูกตีความตามตัวอักษรตามค่าเริ่มต้น ตัวอย่างเช่น นิพจน์ทั่วไป
t
จะจับคู่เฉพาะตัวอักษรตัวพิมพ์เล็กเท่านั้น
t
:
แบบ: t
สตริง: tttt
การแข่งขัน: ^ ^ ^ ^
(
ตัวอย่าง ) อย่างไรก็ตาม ลำดับนี้
\t
ทำงานแตกต่างออกไป เป็นเทมเพลตสำหรับค้นหาอักขระแท็บ:
รูปแบบ: \t
สตริง: tttt
การแข่งขัน: ^ ^ ^
(
ตัวอย่าง ) ลำดับการหลีกทั่วไปบางบรรทัดได้แก่
\n
(ตัวแบ่งบรรทัดแบบ UNIX) และ
\r
(ใช้ในตัวแบ่งบรรทัดแบบ Windows
\r\n
)
\r
เป็นอักขระ "แคร่กลับ" และ
\n
เป็นอักขระ "ป้อนบรรทัด"
ซึ่งทั้งสองถูกกำหนดพร้อมกับมาตรฐาน ASCII เมื่อเครื่องโทรพิมพ์ยังคงใช้อย่างแพร่หลาย ลำดับการหลีกเลี่ยงทั่วไปอื่นๆ จะกล่าวถึงในภายหลังในบทช่วยสอนนี้
ในระหว่างนี้ มาเสริมเนื้อหาด้วยปริศนาง่ายๆ สองสามข้อ:
ลองเขียนนิพจน์ทั่วไปเพื่อค้นหา... นิพจน์ทั่วไป ;) ผลลัพธ์ควรเป็นดังนี้:
ลวดลาย:
สตริง: ...จับคู่ regex นี้ ` \[\] ` กับ regex หรือไม่
ตรงกัน: ^^^
(
วิธีแก้ไข ) คุณจัดการหรือไม่? ทำได้ดี! ตอนนี้ให้ลองสร้าง regex เพื่อค้นหาลำดับการหลีกเลี่ยงดังนี้:
ลวดลาย:
สตริง: ` \r `, ` \t ` และ ` \n ` ล้วนเป็นลำดับหลีก regex
ตรงกัน: ^^ ^^ ^^
(
สารละลาย )
ขั้นตอนที่ 4: ค้นหาอักขระ "ใดก็ได้" โดยใช้จุด.
เมื่อเขียนวิธีแก้ปัญหาการจับคู่ลำดับหลีกที่เราเห็นในขั้นตอนที่แล้ว คุณอาจสงสัยว่า "ฉันสามารถจับคู่อักขระแบ็กสแลชและอักขระอื่นที่ตามหลังได้หรือไม่"... แน่นอนคุณทำได้! มีอักขระพิเศษอีกตัวหนึ่งที่ใช้จับคู่ (เกือบ) อักขระใดๆ - อักขระจุด (จุดเต็ม) นี่คือสิ่งที่มันทำ:
ลวดลาย: .
สตริง: ฉันขอโทษเดฟ ฉันเกรงว่าจะทำอย่างนั้นไม่ได้
การแข่งขัน: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(
ตัวอย่าง ) หากคุณต้องการจับคู่รูปแบบที่ดูเหมือนลำดับหลีก คุณสามารถดำเนินการดังนี้:
ลวดลาย: \\.
สตริง: สวัสดี Walmart คือหลานชายของฉัน เขาชื่อ " \n \r \t "
ตรงกัน: ^^ ^^ ^^
(
ตัวอย่าง ) และเช่นเดียวกับอักขระพิเศษทั้งหมด หากคุณต้องการจับคู่ตัวอักษร
.
คุณต้องนำหน้าด้วยอักขระ
\
:
ลวดลาย: \.
สตริง: สงครามคือสันติภาพ. เสรีภาพคือการเป็นทาส ความไม่รู้คือความเข้มแข็ง
การแข่งขัน: ^ ^ ^
(
ตัวอย่าง )
ขั้นตอนที่ 5: ช่วงอักขระ
จะเป็นอย่างไรหากคุณไม่ต้องการสัญลักษณ์ใดๆ แต่ต้องการเพียงค้นหาตัวอักษรในข้อความเท่านั้น หรือตัวเลข? หรือสระ? การค้นหาตามคลาสของตัวละครและช่วงของพวกมันจะทำให้เราบรรลุเป้าหมายนี้ได้
` \n `, ` \r ` และ ` \t ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \
[ ` ไม่ใช่
อักขระจะเป็น "ช่องว่าง"
หากไม่ได้สร้างเครื่องหมายที่มองเห็นได้ในข้อความ ช่องว่าง "
" คือช่องว่าง ตัวแบ่งบรรทัด หรือแท็บ สมมติว่าเราต้องการค้นหาลำดับหลีกที่แสดงเฉพาะอักขระช่องว่าง
\n
และในข้อความข้างต้น แต่ไม่ใช่ลำดับหลีกอื่น
\r
ๆ
\t
เราจะทำเช่นนี้ได้อย่างไร?
รูปแบบ: \\[nrt]
string: ` \n `, ` \r ` และ ` \t ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^ ^^ ^^
(
ตัวอย่าง ) ใช้งานได้ แต่ไม่ใช่วิธีแก้ปัญหาที่หรูหรามากนัก จะเกิดอะไรขึ้นหากในภายหลังเราต้องจับคู่ลำดับการหลีกเลี่ยงสำหรับอักขระ "ฟีดแบบฟอร์ม"
\f
? (สัญลักษณ์นี้ใช้เพื่อระบุตัวแบ่งหน้าในข้อความ)
รูปแบบ: \\[nrt]
string: ` \n `, ` \r `, ` \t ` และ ` \f ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^ ^^ ^^
(
ใช้งานไม่ได้ ) ด้วยวิธีนี้ เราจำเป็นต้องแยกรายการอักษรตัวพิมพ์เล็กแต่ละตัวที่เราต้องการจับคู่แยกกันในวงเล็บเหลี่ยม วิธีที่ง่ายกว่าในการทำเช่นนี้คือการใช้ช่วงอักขระเพื่อให้ตรงกับตัวอักษรตัวพิมพ์เล็ก:
รูปแบบ: \\[az]
string: ` \n `, ` \r `, ` \t ` และ ` \f ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^ ^^ ^^ ^^
(
และใช้งานได้แล้ว ) ช่วงอักขระทำงานได้ตามที่คุณคาดหวัง ตามตัวอย่างด้านบน ใส่วงเล็บเหลี่ยมรอบตัวอักษรตัวแรกและตัวสุดท้ายที่คุณต้องการจับคู่ โดยมีเครื่องหมายยัติภังค์อยู่ระหว่าง ตัวอย่างเช่น หากคุณต้องการค้นหา "ชุด" ของแบ็กสแลช
\
และตัวอักษรหนึ่งตัวจาก
a
ถึง
m
คุณสามารถดำเนินการดังต่อไปนี้:
รูปแบบ: \\[am]
สตริง: ` \n `, ` \r `, ` \t ` และ ` \f ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^
(
ตัวอย่าง ) หากคุณต้องการจับคู่หลายช่วง เพียงวางช่วงตั้งแต่ต้นจนจบระหว่างวงเล็บเหลี่ยม:
รูปแบบ: \\[a-gq-z]
string: ` \n `, ` \r `, ` \t ` และ ` \f ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^ ^^ ^^
(
ตัวอย่าง ) ช่วงอักขระทั่วไปอื่นๆ ได้แก่:
A-Z
และ
0-9
มาลองใช้ในทางปฏิบัติและแก้ไขปัญหาสองสามข้อ:
ตัวเลขฐานสิบหกสามารถประกอบด้วยตัวเลข
0-9
และตัวอักษร
A-F
ได้ เมื่อใช้เพื่อระบุสี รหัสฐานสิบหกสามารถมีอักขระได้สูงสุดสามตัว สร้างนิพจน์ทั่วไปเพื่อค้นหารหัสฐานสิบหกที่ถูกต้องในรายการด้านล่าง:
ลวดลาย:
สาย: 1H8 4E2 8FF 0P1 T8B 776 42B G12
ตรงกัน: ^^^ ^^^ ^^^ ^^^
(
วิธีแก้ไข ) ใช้ช่วงอักขระ สร้างนิพจน์ทั่วไปที่จะเลือกเฉพาะพยัญชนะตัวพิมพ์เล็ก (ไม่รวมสระ รวมถึง
y
) ในประโยคด้านล่าง:
ลวดลาย:string
: T h e w a lls i n th e m a r e t o t a lly , t o t a lly t a all .
ตรงกัน: ^ ^ ^^^ ^ ^^ ^ ^^ ^ ^ ^ ^^^ ^ ^ ^^^ ^ ^^
(
สารละลาย )
ขั้นตอนที่ 6: สัญลักษณ์ "ไม่" คาเร็ต เซอร์คัมเฟล็กซ์ คาเร็ต...^
แท้จริงแล้ว มีชื่อมากกว่า 9,000 ชื่อสำหรับสัญลักษณ์นี้ :) แต่เพื่อความเรียบง่าย บางทีเราอาจเน้นที่ "ไม่ใช่" วิธีแก้ปัญหาของฉันสำหรับปัญหาสุดท้ายนั้นค่อนข้างยาว ต้องใช้อักขระ 17 ตัวในการพูดว่า "ได้ตัวอักษรทั้งหมดยกเว้นสระ" แน่นอนว่ามีวิธีที่ง่ายกว่าในการทำเช่นนี้ เครื่องหมาย "ไม่"
^
ช่วยให้เราสามารถระบุอักขระและช่วงของอักขระที่ต้อง
ไม่ตรงกับที่ระบุในรูปแบบ วิธีแก้ปัญหาสุดท้ายที่ง่ายกว่าคือการค้นหาอักขระที่ไม่เป็นตัวแทนของสระ:
รูปแบบ: [ ^ aeiou ]สตริง
: ฉันจะต้องทั้งหมดr e t o t a lly , t o t a lly t a all
ตรงกัน: ^^ ^^ ^^^^ ^^^^ ^^ ^^^ ^ ^^ ^ ^^^^^^ ^ ^^^^^ ^^^
(
ตัวอย่าง ) เครื่องหมาย "ไม่"
^
เป็นอักขระซ้ายสุดภายในวงเล็บเหลี่ยม
[]
จะบอกเอ็นจิ้นนิพจน์ทั่วไปให้จับคู่อักขระหนึ่งตัว (ใดก็ได้) ที่ไม่ได้อยู่ในวงเล็บเหลี่ยม ซึ่งหมายความว่านิพจน์ทั่วไปข้างต้นจะจับคู่ช่องว่าง จุด
.
เครื่องหมายจุลภาค
,
และตัวพิมพ์ใหญ่
T
ที่จุดเริ่มต้นของประโยค ทั้งหมดด้วย หากต้องการแยกออก เราสามารถใส่ไว้ในวงเล็บเหลี่ยมได้:
รูปแบบ: [^aeiou .,T] string
: T h e w a lls i n th e m a all a r e t o t ally , t o t a lly t a ll
ตรงกัน: ^ ^ ^^^ ^ ^^ ^ ^^ ^ ^ ^ ^^^ ^ ^ ^^^ ^ ^^
(
ตัวอย่าง )
บันทึกในกรณีนี้ เราไม่จำเป็นต้องหลีกจุดด้วยเครื่องหมายแบ็กสแลช เหมือนที่เราเคยทำเมื่อค้นหาโดยไม่ใช้วงเล็บเหลี่ยม อักขระพิเศษหลายตัวในวงเล็บเหลี่ยมจะถือว่าตรงตามตัวอักษร รวมถึงอักขระเปิด
[
แต่ไม่ใช่วงเล็บปิดด้วย
]
(คุณเดาได้ไหมว่าทำไม) อักขระแบ็กสแล
\
ชยังไม่ถูกตีความตามตัวอักษร หากคุณต้องการจับคู่แบ็กสแลชตามตัวอักษรโดย
\
ใช้วงเล็บเหลี่ยม คุณต้องหลีกเลี่ยงโดยใช้แบ็กสแลชต่อไปนี้
\\
ลักษณะการทำงานนี้ได้รับการออกแบบเพื่อให้สามารถวางอักขระช่องว่างในวงเล็บเหลี่ยมเพื่อจับคู่:
รูปแบบ: [\t]
สตริง: tttt
การแข่งขัน: ^ ^ ^
(
ตัวอย่าง ) เครื่องหมาย "not"
^
สามารถใช้กับช่วงได้ หากฉันต้องการจับเฉพาะตัวละคร
a
,
b
,
c
,
x
,
y
และ
z
ฉันสามารถทำได้ดังนี้:
รูปแบบ: [abcxyz]
สตริง: abc defghijklmnopqrstuvw xyz
ตรงกัน: ^^^ ^^^
(
ตัวอย่าง ) ...หรือระบุได้ว่าต้องการค้นหาอักขระใดๆ ที่
ไม่ อยู่ ระหว่าง
d
และ
w
:
รูปแบบ: [^dw]
สตริง: abc defghijklmnopqrstuvw xyz
ตรงกัน: ^^^ ^^^
(
ตัวอย่าง ) อย่างไรก็ตาม
ระวัง^
ด้วยคำ ว่า"ไม่" เป็นเรื่องง่ายที่จะคิดว่า "ฉันระบุแล้ว
[^ b-f]
ดังนั้นฉันควรจะใช้อักษรตัวพิมพ์เล็ก
a
หรืออะไรสักอย่างที่อยู่หลัง "
f
ซึ่งไม่เป็นเช่นนั้น regex นี้จะจับคู่อักขระใดๆ ที่ไม่อยู่ในช่วงนั้น รวมถึงตัวอักษร ตัวเลข เครื่องหมายวรรคตอน และการเว้นวรรค
รูปแบบ: [^dw]
สตริง: abc defg h i , j - klmnopqrstuvw xyz
ตรงกัน: ^^^ ^ ^ ^ ^ ^^^
(
ตัวอย่าง )
ยกระดับงาน:
ใช้เครื่องหมาย "ไม่"
^
ในวงเล็บเหลี่ยมเพื่อจับคู่คำด้านล่างทั้งหมดที่ไม่ได้ลงท้ายด้วย
y
:
ลวดลาย:
string: day dog hog hay bog bay bay rub
แมตช์: ^^^ ^^^ ^^^ ^^^
(
วิธีแก้ไข ) เขียนนิพจน์ทั่วไปโดยใช้ช่วงและเครื่องหมาย "ไม่"
^
เพื่อค้นหาปีทั้งหมดระหว่างปี 1977 ถึง 1982 (รวม):
ลวดลาย:
สตริง: 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984
การแข่งขัน: ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^
(
วิธีแก้ไข ) เขียนนิพจน์ทั่วไปเพื่อค้นหาอักขระทั้งหมดที่ไม่ใช่อักขระเครื่องหมาย "ไม่"
^
:
ลวดลาย:
string: abc1 ^ 23*()
ตรงกัน: ^^^^ ^^^^^
(
สารละลาย )
ขั้นตอนที่ 7: คลาสตัวละคร
คลาสอักขระนั้นง่ายกว่าช่วงอักขระด้วยซ้ำ เอ็นจิ้นนิพจน์ทั่วไปที่แตกต่างกันมีคลาสที่แตกต่างกัน ดังนั้นฉันจะพูดถึงเฉพาะคลาสหลักที่นี่เท่านั้น (ตรวจสอบเวอร์ชันของ regex ที่คุณใช้อยู่ เนื่องจากอาจมีมากกว่านั้น - หรืออาจแตกต่างจากที่แสดงไว้ที่นี่) คลาสอักขระทำงานเกือบจะเหมือนกับช่วง แต่คุณไม่สามารถระบุค่า 'start' และ 'end' ได้:
ระดับ |
สัญลักษณ์ |
\d |
"ตัวเลข"[0-9] |
\w |
"สัญลักษณ์คำ"[A-Za-z0-9_] |
\s |
"ช่องว่าง"[ \t\r\n\f] |
คลาสอักขระ "word"
\w
มีประโยชน์อย่างยิ่ง เนื่องจากชุดอักขระนี้มักจำเป็นสำหรับตัวระบุที่ถูกต้อง (ชื่อตัวแปร ชื่อฟังก์ชัน ฯลฯ) ในภาษาการเขียนโปรแกรมต่างๆ เราสามารถใช้
\w
เพื่อทำให้นิพจน์ทั่วไปที่เราเห็นก่อนหน้านี้ง่ายขึ้น:
รูปแบบ: \\[az]
string: ` \n `, ` \r `, ` \t ` และ ` \f ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^ ^^ ^^ ^^
การใช้
\w
เราสามารถเขียนได้ดังนี้:
รูปแบบ: \\\w
string: ` \n `, ` \r `, ` \t ` และ ` \f ` เป็นอักขระช่องว่าง ` \ `, ` \\ ` และ ` \ [ ` ไม่ใช่
ตรงกัน: ^^ ^^ ^^ ^^
(
ตัวอย่าง )
2 งานเพื่อโชค:
อย่างที่คุณและฉันรู้ ใน Java ตัวระบุ (ชื่อของตัวแปร คลาส ฟังก์ชัน ฯลฯ) สามารถขึ้นต้นด้วยตัวอักษร-
a
-
zA
เครื่องหมาย
Z
ดอลลาร์
$
หรือขีดล่าง เท่านั้น
_
(
แน่นอนว่าการขีดเส้นใต้เป็นรูปแบบที่ไม่ดี แต่คอมไพเลอร์ข้ามไป หมายเหตุของผู้แปล ) อักขระที่เหลือจะต้องเป็นอักขระ "คำ
\w
" การใช้คลาสอักขระตั้งแต่หนึ่งคลาสขึ้นไป สร้างนิพจน์ทั่วไปเพื่อค้นหาตัวระบุ Java ที่ถูกต้องในลำดับสามอักขระต่อไปนี้:
ลวดลาย:
สตริง: __e $12 .x2 foo Bar 3mm
ตรงกัน: ^^^ ^^^ ^^^ ^^^
(
วิธีแก้ไข ) หมายเลขประกันสังคมของสหรัฐอเมริกา (SSN) เป็นตัวเลข 9 หลักในรูปแบบ XXX-XX-XXXX โดยที่ X แต่ละตัวสามารถเป็นตัวเลขใด
[0-9]
ก็ได้ ใช้คลาสอักขระตั้งแต่หนึ่งคลาสขึ้นไป เขียนนิพจน์ทั่วไปเพื่อค้นหา SSN ที่มีรูปแบบถูกต้องในรายการด้านล่าง:
ลวดลาย:
สายอักขระ: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
การแข่งขัน: ^^^^^^^^^^^
(
โซลูชัน )
RegEx: 20 ขั้นตอนสั้น ๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป ส่วนที่ 2 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป ส่วนที่ 3 RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป ตอนที่ 4
GO TO FULL VERSION