JavaRush /จาวาบล็อก /Random-TH /RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป ส่วนที่...
Artur
ระดับ
Tallinn

RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป ส่วนที่ 1

เผยแพร่ในกลุ่ม
ต้นฉบับของบทความนี้อยู่ที่นี่ อาจไม่มีทฤษฎีใดที่มากเกินไป และฉันจะให้ลิงก์หลายรายการไปยังเนื้อหาที่มีรายละเอียดเพิ่มเติมเกี่ยวกับ regex ในตอนท้ายของบทความ แต่สำหรับฉันดูเหมือนว่าการเริ่มเจาะลึกหัวข้อเช่นนิพจน์ทั่วไปจะน่าสนใจกว่านี้มากหากมีโอกาสที่ไม่เพียงแต่อัดแน่นเท่านั้น แต่ยังรวบรวมความรู้ได้ทันทีโดยทำงานเล็ก ๆ ให้สำเร็จไปพร้อมกัน RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ตอนที่ 1 - 1มาเริ่มกันเลย. โดยทั่วไปแล้วฝ่ายตรงข้ามของการใช้นิพจน์ทั่วไป ('RegEx' หรือเพียงแค่ 'regex') ในการเขียนโปรแกรมอ้างอิงคำพูดต่อไปนี้ซึ่งมาจาก Jamie Zawinski: "บางคนเมื่อประสบปัญหาคิดว่า 'ฉันรู้ ฉันจะใช้นิพจน์ทั่วไป .'" ตอนนี้พวกเขามีปัญหาสองประการ" ที่จริงแล้ว การใช้นิพจน์ทั่วไปยังไม่ใช่ความคิดที่ดีหรือไม่ดี และสิ่งนี้ในตัวมันเองจะไม่เพิ่มปัญหาและจะไม่แก้ปัญหาใด ๆ มันเป็นเพียงเครื่องมือ และวิธีที่คุณใช้ (ถูกหรือผิด) จะเป็นตัวกำหนดผลลัพธ์ที่คุณจะเห็น ตัวอย่างเช่น หากคุณพยายามใช้ regex เพื่อสร้างโปรแกรมแยกวิเคราะห์ HTML คุณมักจะประสบปัญหา แต่ถ้าคุณเพียงต้องการแยก เช่น การประทับเวลาจากบางแถว คุณก็อาจจะสบายดี เพื่อให้คุณเชี่ยวชาญนิพจน์ทั่วไปได้ง่ายขึ้น ฉันได้รวบรวมบทเรียนนี้ซึ่งจะช่วยให้คุณเชี่ยวชาญนิพจน์ทั่วไปตั้งแต่เริ่มต้นในขั้นตอนสั้นๆ เพียง 20 ขั้นตอน บทช่วยสอนนี้มุ่งเน้นไปที่แนวคิดพื้นฐานของนิพจน์ทั่วไปเป็นหลัก และเจาะลึกหัวข้อขั้นสูงเพิ่มเติมเท่าที่จำเป็นเท่านั้น

ขั้นตอนที่ 1: เหตุใดจึงต้องใช้นิพจน์ทั่วไป

RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ส่วนที่ 1 - 2นิพจน์ทั่วไปใช้เพื่อค้นหารายการที่ตรงกันในข้อความโดยใช้รูปแบบ (รูปแบบ) ที่ระบุ เมื่อใช้ regex เราสามารถแยกคำ ออก จากข้อความ รวมถึงอักขระตัวอักษรและเมตาแต่ละตัว รวมถึงลำดับที่ตรงตามเกณฑ์ที่กำหนดได้อย่าง ง่ายดายและง่ายดาย นี่คือสิ่งที่ Wikipedia บอกเราเกี่ยวกับสิ่งเหล่านี้ : นิพจน์ทั่วไปเป็นภาษาทางการสำหรับการค้นหาและจัดการสตริงย่อยในข้อความ โดยอิงตามการใช้อักขระเมตา (อักขระตัวแทน) สำหรับการค้นหา จะใช้สตริงตัวอย่าง (รูปแบบภาษาอังกฤษในภาษารัสเซีย มักเรียกว่า "เทมเพลต", "มาสก์") ซึ่งประกอบด้วยสัญลักษณ์และสัญลักษณ์เมตา และการกำหนดกฎการค้นหา ในการจัดการข้อความ จะมีการระบุสตริงการแทนที่เพิ่มเติม ซึ่งอาจประกอบด้วยอักขระพิเศษได้เช่นกัน รูปแบบอาจเรียบง่ายเหมือนกับคำdogในประโยคนี้:
สุนัขจิ้งจอกสีน้ำตาลที่รวดเร็วกระโดดข้ามสุนัขขี้เกียจ
นิพจน์ทั่วไปนี้มีลักษณะดังนี้:
สุนัข
...ง่ายพอแล้วใช่ไหมล่ะ? รูปแบบนี้อาจเป็นคำใดก็ได้ที่มีตัวอักษรoด้วย นิพจน์ทั่วไปเพื่อค้นหารูปแบบดังกล่าวอาจมีลักษณะดังนี้:
\ ว้า*
( คุณสามารถลองใช้นิพจน์ทั่วไปนี้ได้ที่นี่ ) คุณจะสังเกตเห็นว่าเมื่อข้อกำหนด "การจับคู่" มีความซับซ้อนมากขึ้น นิพจน์ทั่วไปก็จะซับซ้อนมากขึ้นด้วย มีรูปแบบเพิ่มเติมสำหรับการระบุกลุ่มอักขระและรูปแบบการซ้ำที่ตรงกัน ซึ่งฉันจะอธิบายด้านล่าง แต่ทันทีที่เราพบรูปแบบที่ตรงกับข้อความบางข้อความ แล้วเราจะทำอย่างไรกับรูปแบบนั้น? เอ็นจิ้นนิพจน์ทั่วไปสมัยใหม่ช่วยให้คุณสามารถแยกอักขระหรือลำดับของอักขระ (สตริงย่อย) ออกจากข้อความที่มีอยู่ หรือลบออก หรือแทนที่ด้วยข้อความอื่น โดยทั่วไป นิพจน์ทั่วไปใช้ในการแยกวิเคราะห์และจัดการข้อความ ตัวอย่างเช่น เราสามารถแยกสตริงย่อยที่ดูเหมือนที่อยู่ IP แล้วลองตรวจสอบดู หรือเราสามารถแยกชื่อและที่อยู่อีเมลและจัดเก็บไว้ในฐานข้อมูลได้ หรือใช้นิพจน์ทั่วไปเพื่อค้นหาข้อมูลที่ละเอียดอ่อน (เช่น หมายเลขหนังสือเดินทางหรือหมายเลขโทรศัพท์) ในอีเมล และแจ้งเตือนผู้ใช้ว่าพวกเขาอาจทำให้ตัวเองตกอยู่ในความเสี่ยง Regex เป็นเครื่องมืออเนกประสงค์อย่างแท้จริงที่เรียนรู้ได้ง่ายแต่ยากที่จะเชี่ยวชาญ: “การเล่นดนตรีได้ดีกับการสร้างเพลงมีความแตกต่างระหว่างการรู้จักสำนวนปกติกับการทำความเข้าใจมัน” - Jeffrey E.F. Friedl, การเรียนรู้นิพจน์ทั่วไป

ขั้นตอนที่ 2: วงเล็บเหลี่ยม[]

นิพจน์ทั่วไปที่ง่ายที่สุดที่เข้าใจได้ง่ายคือนิพจน์ทั่วไปที่มองหาการจับคู่อักขระต่ออักขระระหว่างรูปแบบนิพจน์ทั่วไปและสตริงเป้าหมาย ตัวอย่างเช่น ลองหาแมว: RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ส่วนที่ 1 - 3
รูปแบบ: แมว
เชือก: แมวถูกตัดตอนวิ่งใต้ท้องรถ
ตรงกัน:      ^^^
( วิธีการทำงานในทางปฏิบัติ - ดูที่นี่ ) หมายเหตุ! วิธีแก้ปัญหาทั้งหมดจะถูกนำเสนอที่นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้เท่านั้น ในนิพจน์ทั่วไป เช่นเดียวกับในการเขียนโปรแกรมทั่วไป คุณสามารถแก้ไขปัญหาเดียวกันได้หลายวิธี อย่างไรก็ตาม นอกเหนือจากการเปรียบเทียบอักขระต่ออักขระที่เข้มงวดแล้ว เรายังสามารถระบุการจับคู่ทางเลือกอื่นโดยใช้วงเล็บเหลี่ยม:
รูปแบบ: 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: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ส่วนที่ 1 - 4ในขั้นตอนที่แล้ว เราได้เรียนรู้เกี่ยวกับวงเล็บเหลี่ยม[]และวิธีที่วงเล็บช่วยเราค้นหารายการที่ตรงกันอื่นโดยใช้เครื่องมือ 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: ค้นหาอักขระ "ใดก็ได้" โดยใช้จุด.

RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ส่วนที่ 1 - 5เมื่อเขียนวิธีแก้ปัญหาการจับคู่ลำดับหลีกที่เราเห็นในขั้นตอนที่แล้ว คุณอาจสงสัยว่า "ฉันสามารถจับคู่อักขระแบ็กสแลชและอักขระอื่นที่ตามหลังได้หรือไม่"... แน่นอนคุณทำได้! มีอักขระพิเศษอีกตัวหนึ่งที่ใช้จับคู่ (เกือบ) อักขระใดๆ - อักขระจุด (จุดเต็ม) นี่คือสิ่งที่มันทำ:
ลวดลาย: .
สตริง: ฉันขอโทษเดฟ ฉันเกรงว่าจะทำอย่างนั้นไม่ได้
การแข่งขัน: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^	
( ตัวอย่าง ) หากคุณต้องการจับคู่รูปแบบที่ดูเหมือนลำดับหลีก คุณสามารถดำเนินการดังนี้:
ลวดลาย: \\. 
สตริง: สวัสดี Walmart คือหลานชายของฉัน เขาชื่อ " \n \r \t "
ตรงกัน:                                              ^^ ^^ ^^	
( ตัวอย่าง ) และเช่นเดียวกับอักขระพิเศษทั้งหมด หากคุณต้องการจับคู่ตัวอักษร.คุณต้องนำหน้าด้วยอักขระ\:
ลวดลาย: \. 
สตริง: สงครามคือสันติภาพ. เสรีภาพคือการเป็นทาส ความไม่รู้คือความเข้มแข็ง 
การแข่งขัน:             ^ ^ ^
( ตัวอย่าง )

ขั้นตอนที่ 5: ช่วงอักขระ

RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ส่วนที่ 1 - 6จะเป็นอย่างไรหากคุณไม่ต้องการสัญลักษณ์ใดๆ แต่ต้องการเพียงค้นหาตัวอักษรในข้อความเท่านั้น หรือตัวเลข? หรือสระ? การค้นหาตามคลาสของตัวละครและช่วงของพวกมันจะทำให้เราบรรลุเป้าหมายนี้ได้
` \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: สัญลักษณ์ "ไม่" คาเร็ต เซอร์คัมเฟล็กซ์ คาเร็ต...^

RegEx: 20 ขั้นตอนสั้นๆ เพื่อเชี่ยวชาญนิพจน์ทั่วไป  ตอนที่ 1 - 7แท้จริงแล้ว มีชื่อมากกว่า 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
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION