คำนำ
บทความนี้จะแนะนำคลาสรูปแบบและคลาสจับคู่ในนิพจน์ปกติของ Java ก่อนอื่นเราต้องเข้าใจอย่างชัดเจนว่านิพจน์ทั่วไปที่ระบุเป็นสตริงจะต้องรวบรวมเป็นอินสแตนซ์ของคลาสรูปแบบก่อน ดังนั้นวิธีการทำความเข้าใจสองชั้นนี้ให้ดีขึ้นเป็นสิ่งที่โปรแกรมเมอร์ต้องรู้
มาดูสองหมวดหมู่นี้:
1. แนวคิดของการจับกลุ่ม
กลุ่มจับภาพสามารถกำหนดหมายเลขได้โดยการคำนวณวงเล็บเปิดจากซ้ายไปขวาซึ่งเริ่มต้นด้วย 1 ตัวอย่างเช่นในนิพจน์ ((a) (b (c))) มีสี่กลุ่มดังกล่าว:
1 ((a) (b (c))) 2 (a) 3 (b (c)) 4 (c)
ศูนย์กลุ่มมักจะเป็นตัวแทนของนิพจน์ทั้งหมด กลุ่มที่เริ่มต้นด้วย (?) เป็นกลุ่มที่ไม่ได้รับการจับที่บริสุทธิ์ซึ่งไม่ได้จับข้อความและไม่นับรวมกับการนับคอมโบ
อินพุตการจับภาพที่เกี่ยวข้องกับกลุ่มมักจะเป็นลำดับที่ตรงกับกลุ่มล่าสุด หากกลุ่มถูกคำนวณอีกครั้งเนื่องจากการวัดปริมาณค่าที่จับก่อนหน้านี้จะถูกเก็บไว้ในความล้มเหลวในการคำนวณครั้งที่สอง (ถ้ามี) ตัวอย่างเช่นการจับคู่สตริง "ABA" กับนิพจน์ (a (b)?)+ จะตั้งกลุ่มที่สองเป็น "B" ในตอนต้นของการแข่งขันแต่ละครั้งอินพุตที่จับได้ทั้งหมดจะถูกยกเลิก
2. คำอธิบายโดยละเอียดเกี่ยวกับรูปแบบและคลาสจับคู่
การแสดงออกปกติของ Java จะถูกนำไปใช้ผ่านคลาสรูปแบบและคลาส Matcher ภายใต้แพ็คเกจ Java.util.regex (ขอแนะนำให้คุณเปิดเอกสาร Java API เมื่ออ่านบทความนี้เมื่อแนะนำวิธีการที่แนะนำให้ใช้วิธีการตรวจสอบวิธีการใน Java API และผลกระทบจะดีขึ้น)
คลาสรูปแบบใช้เพื่อสร้างนิพจน์ทั่วไปหรืออาจกล่าวได้ว่าสร้างรูปแบบการจับคู่ ตัวสร้างของมันเป็นแบบส่วนตัวและไม่สามารถสร้างได้โดยตรง แต่สามารถสร้างนิพจน์ทั่วไปผ่านวิธีการอย่างง่าย ๆ จากโรงงานของ Pattern.complie(String regex)
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// w+"); p.pattern (); // return/w+ pattern() ส่งคืนรูปแบบสตริงของนิพจน์ทั่วไปซึ่งจริง ๆ แล้วเป็นพารามิเตอร์ regex ของ Pattern.complile(String regex)
1. pattern.split (อินพุต charsequence)
รูปแบบมีวิธี split(CharSequence input) ซึ่งใช้ในการแยกสตริงและส่งคืนสตริง [] ฉันเดาว่า String.split(String regex) ถูกนำไปใช้ผ่าน Pattern.split(CharSequence input)
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); String [] str = p.split ("QQ ของฉันคือ: 456456 โทรศัพท์ของฉันคือ: 0532214 อีเมลของฉันคือ: [email protected]");ผลลัพธ์: str [0] = "QQ ของฉันคือ:" str [1] = "โทรศัพท์ของฉันคือ:" str [2] = "อีเมลของฉันคือ: [email protected]"
2. pattern.matcher (string regex, charsequence input) เป็นวิธีการคงที่ที่ใช้ในการจับคู่สตริงอย่างรวดเร็ว วิธีนี้เหมาะสำหรับการจับคู่เพียงครั้งเดียวและจับคู่สตริงทั้งหมด
ตัวอย่างรหัส Java:
pattern.matches ("// d+", "2223"); // return true pattern.matches ("// d+", "2223aa"); // return false สตริงทั้งหมดต้องจับคู่เพื่อส่งคืนที่นี่ไม่สามารถจับคู่ได้3.Pattern.Matcher (อินพุต Chareespence)
หลังจากพูดมากในที่สุดมันก็กลายเป็นเทิร์นของคลาส Matcher ที่จะเปิดตัว Pattern.matcher(CharSequence input) ส่งคืนวัตถุจับคู่
วิธีตัวสร้างของคลาส Matcher นั้นเป็นส่วนตัวและไม่สามารถสร้างได้ตามความประสงค์ มันสามารถรับอินสแตนซ์ของคลาสนี้ผ่านวิธี Pattern.matcher(CharSequence input)
คลาสรูปแบบสามารถทำการจับคู่อย่างง่าย ๆ เท่านั้น เพื่อให้ได้การดำเนินการจับคู่ปกติที่แข็งแกร่งและสะดวกยิ่งขึ้นจำเป็นต้องให้ความร่วมมือกับรูปแบบและตัวจับคู่ คลาส Matcher ให้การสนับสนุนการจัดกลุ่มสำหรับนิพจน์ทั่วไปและการสนับสนุนการจับคู่หลายรายการสำหรับการแสดงออกปกติ
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); Matcher M = P.Matcher ("22BB23"); m.pattern (); // return p นั่นคือการส่งคืนวัตถุรูปแบบที่สร้างขึ้นโดยวัตถุจับคู่4.Matcher.matches ()/matcher.lookingat ()/matcher.find ()
คลาส Matcher มีวิธีการดำเนินการจับคู่สามวิธี ทั้งสามวิธีส่งคืนประเภทบูลีน ส่งคืนจริงเมื่อถึงการแข่งขัน หากไม่มีการจับคู่มันจะส่งกลับเท็จ
matches() ตรงกับสตริงทั้งหมดและส่งคืนจริงเฉพาะในกรณีที่สตริงทั้งหมดตรงกัน
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); Matcher M = P.Matcher ("22BB23"); M.Matches (); // return false เนื่องจาก BB ไม่สามารถจับคู่ได้โดย/d+ส่งผลให้การจับคู่ของสตริงทั้งหมดไม่สำเร็จ Matcher M2 = P.Matcher ("2223"); m2.matches (); // ส่งคืนจริงเพราะ/d+ ตรงกับสตริงทั้งหมด ลองย้อนกลับไปที่ Pattern.matcher(String regex,CharSequence input) ซึ่งเทียบเท่ากับรหัสต่อไปนี้
Pattern.compile(regex).matcher(input).matches()
lookingAt() ตรงกับสตริงก่อนหน้าและส่งคืนจริงเฉพาะเมื่อสตริงการจับคู่อยู่ด้านหน้า
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); Matcher M = P.Matcher ("22BB23"); m.lookingat (); // return true, เพราะ/d+ ตรงกับ 22 matcher ก่อนหน้า m2 = p.matcher ("aa2223"); m2.lookingat (); // return false เนื่องจาก/d+ ไม่สามารถจับคู่ AA ก่อนหน้าได้ find() ตรงกับสตริงและสตริงการจับคู่สามารถอยู่ได้ทุกที่
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); Matcher M = P.Matcher ("22BB23"); m.find (); // ส่งคืน true matcher m2 = p.matcher ("aa2223"); m2.find (); // ส่งคืน true matcher m3 = p.matcher ("aa2223bb"); m3.find (); // ส่งคืน true matcher m4 = p.matcher ("aabb"); m4.find (); // return false5.mathcer.start ()/matcher.end ()/matcher.group ()
หลังจากใช้การ matches() , lookingAt() และ find() เพื่อดำเนินการจับคู่คุณสามารถใช้สามวิธีข้างต้นเพื่อรับข้อมูลรายละเอียดเพิ่มเติม
start() ส่งคืนตำแหน่งดัชนีของสตริงย่อยที่ตรงกันในสตริง
end() ส่งคืนตำแหน่งดัชนีของอักขระสุดท้ายของสตริงย่อยที่ตรงกันในสตริง
group() ส่งคืนสตริงย่อยที่ตรงกัน
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); Matcher M = P.Matcher ("AAA2223BB"); M.Find (); // Match 2223 M.Start (); // return 3 m.end (); // return 7, หมายเลขดัชนีหลังจาก 2223 M.Group (); // return 2223 Mathcer M2 = M.Matcher ("2223BB"); m.lookingat (); // จับคู่ 2223 M.Start (); // return 0 เนื่องจาก Lookat () สามารถจับคู่สตริงก่อนหน้านี้เมื่อใช้ Lookat () เพื่อจับคู่วิธีการเริ่มต้น () จะส่งกลับ 0 m.end () เสมอ; // ส่งคืน 4 m.group (); // return 2223 matcher m3 = m.matcher ("2223bb"); M.Matches (); // จับคู่สตริงทั้งหมด m.start (); // return 0 ฉันเชื่อว่าทุกคนรู้เหตุผล m.end (); // return 6 ฉันเชื่อว่าทุกคนรู้เหตุผลเพราะการจับคู่ () จำเป็นต้องจับคู่สตริง m.group ทั้งหมด (); // return 2223bb ต้องพูดมากฉันเชื่อว่าทุกคนเข้าใจการใช้วิธีการข้างต้น เราควรพูดคุยเกี่ยวกับวิธีการใช้การแสดงออกอย่างสม่ำเสมอใน Java
มีวิธีการมากเกินไปสำหรับ start() , end() และ group() พวกเขา start(int i) , end(int i) , group(int i) โดยเฉพาะสำหรับการดำเนินการกลุ่ม คลาส Mathcer ยังมี groupCount() เพื่อส่งคืนจำนวนกลุ่มที่มี
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("([az]+) (// d+)"); Matcher M = P.Matcher ("AAA2223BB"); m.find (); // จับคู่ AAA2223 M.GroupCount (); // return 2 เนื่องจากมี 2 กลุ่มของ M.Start (1); // return 0 ส่งคืนหมายเลขดัชนีของกลุ่มแรกของ substrings ที่จับคู่ในสตริง M.Start (2); // ส่งคืน 3 m.end (1); // ส่งคืน 3 ส่งคืนตำแหน่งดัชนีของอักขระสุดท้ายของกลุ่มแรกของ substrings ที่จับคู่ในสตริง m.end (2); // ส่งคืน 7 m.group (1); // ส่งคืน AAA, ส่งคืนกลุ่มแรกของกลุ่มย่อยที่ตรงกัน M.group (2); // return 2223, ส่งคืนชุดย่อยที่สองของการจับคู่ ตอนนี้เรามาใช้การดำเนินการจับคู่ปกติระดับสูงขึ้นเล็กน้อยตัวอย่างเช่นมีชิ้นส่วนของข้อความที่มีตัวเลขจำนวนมากอยู่ในนั้นและตัวเลขเหล่านี้จะถูกแยกออก ตอนนี้เราต้องนำตัวเลขทั้งหมดออกไปในข้อความ มันง่ายมากที่จะใช้การดำเนินงานปกติของ Java
ตัวอย่างรหัส Java:
รูปแบบ p = pattern.compile ("// d+"); Matcher M = P.Matcher ("QQ ของฉันคือ: 456456 โทรศัพท์ของฉันคือ: 0532214 อีเมลของฉันคือ: [email protected]"); ในขณะที่ (m.find ()) {system.out.println (m.group ()); -เอาท์พุท:
456456 0532214 123
หากคุณแทนที่ข้างต้น while() ลูปด้วย
ในขณะที่ (m.find ()) {system.out.println (m.group ()); System.out.print ("Start:"+M.Start ()); System.out.println ("สิ้นสุด:"+M.End ()); -จากนั้นเอาต์พุต:
456456 เริ่มต้น: 6 End: 12 0532214 เริ่มต้น: 19 End: 26 123 เริ่มต้น: 36 End: 39
ตอนนี้ทุกคนควรรู้ว่าหลังจากการดำเนินการจับคู่แต่ละค่าของทั้งสามวิธี start() , end() และ group() จะมีการเปลี่ยนแปลงและจะเปลี่ยนเป็นข้อมูลของสตริงย่อยที่ตรงกันและวิธีการมากเกินไปของพวกเขาจะถูกเปลี่ยนเป็นข้อมูลที่เกี่ยวข้อง
หมายเหตุ: เฉพาะเมื่อการดำเนินการจับคู่สำเร็จคุณสามารถใช้สามวิธี start() end() และ group() มิฉะนั้น java.lang.IllegalStateException จะถูกโยนลงนั่นคือเมื่อวิธีการใด ๆ matches() , lookingAt() , find()
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของคุณ หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com