เรามาศึกษานิพจน์ทั่วไปกันต่อ ในบทความนี้ เราจะดูคลาสอักขระที่กำหนดไว้ล่วงหน้าตลอดจนการหาปริมาณ (การค้นหาลำดับ)
คลาสตัวละครที่กำหนดไว้ล่วงหน้า
คลาส APIPattern
ประกอบด้วยคลาสอักขระที่กำหนดไว้ล่วงหน้าซึ่งมีทางลัดที่สะดวกสบายไปยังนิพจน์ทั่วไปที่ใช้กันทั่วไป ในตารางนี้ โครงสร้างในคอลัมน์ด้านซ้ายเป็นการแสดงชวเลขของนิพจน์ในคอลัมน์ด้านขวา ตัวอย่างเช่น\d
หมายถึงตัวเลข (0-9) \w
หมายถึงอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก ขีดล่าง หรือตัวเลข) ใช้คลาสอักขระที่กำหนดไว้ล่วงหน้าทุกครั้งที่เป็นไปได้ ซึ่งจะทำให้โค้ดของคุณอ่านง่ายขึ้นและแก้ไขข้อผิดพลาด โครงสร้างที่ขึ้นต้นด้วยแบ็กสแลชเรียกว่า Escape หรือ Protected ในบทความก่อนหน้านี้ เราได้พูดคุยเกี่ยวกับการหลีกเลี่ยงอักขระพิเศษด้วยแบ็กสแลชหรือสัญลักษณ์\Q
แล้ว\E
ใช้เป็นอักขระปกติ หากคุณใช้แบ็กสแลชที่มีอักขระปกติ (ตัวอักษร) คุณจะต้องหลีกแบ็กสแลชเพื่อให้นิพจน์สามารถคอมไพล์ได้
private final String REGEX = "\\d"; // цифра
ในตัวอย่างนี้\d
นิพจน์ทั่วไป จำเป็นต้องมีแบ็กสแลชเพิ่มเติมเพื่อให้โปรแกรมคอมไพล์ โปรแกรมทดสอบของเราจะอ่านนิพจน์ทั่วไปจากคอนโซลโดยตรง ดังนั้นจึงไม่จำเป็นต้องมีเครื่องหมายทับเพิ่มเติม ตัวอย่างต่อไปนี้สาธิตการใช้คลาสอักขระที่กำหนดไว้ล่วงหน้า: ในสามตัวอย่างแรก นิพจน์ทั่วไปเป็นเพียง " .
" (อักขระพิเศษจุด) ซึ่งหมายถึงอักขระใดๆ ดังนั้นการค้นหาจึงสำเร็จทุกกรณี ตัวอย่างอื่นๆ ใช้คลาสอักขระที่กำหนดไว้ล่วงหน้า ความหมายที่เรากล่าวถึงในตารางด้านบน
ปริมาณ
ปริมาณช่วยให้คุณสามารถระบุจำนวนครั้งของอักขระในสตริงได้ เรามาดูความซับซ้อนของวิธีการทำงานของตัวระบุปริมาณแบบโลภ ขี้เกียจ และโลภมากกันดีกว่า เมื่อมองแวบแรกอาจดูเหมือนว่าปริมาณ X?, X?? และ X?+ ทำงานในลักษณะเดียวกัน: “X มีอยู่เพียงครั้งเดียวหรือไม่มีเลย” มีความแตกต่างเล็กน้อยในการใช้งานตัวระบุปริมาณเหล่านี้ ซึ่งเราจะดูด้านล่างการจับคู่ที่มีความยาวเป็นศูนย์
เริ่มจากคนโลภกันก่อน มาเขียนนิพจน์ทั่วไปที่แตกต่างกันสามแบบ: ตัวอักษร "a" ที่มีอักขระพิเศษ ?, * หรือ + มาดูกันว่าเกิดอะไรขึ้นถ้าเราทดสอบนิพจน์ทั่วไปเหล่านี้ในบรรทัดว่าง: ในตัวอย่างข้างต้น การค้นหาประสบความสำเร็จในสองกรณีแรก เนื่องจากนิพจน์ a? และ a* อนุญาตให้อักขระ a หายไปจากสตริง โปรดทราบว่าดัชนีการเริ่มต้นและการจับคู่ครั้งสุดท้ายจะเหมือนกัน (0) เนื่องจากสตริงอินพุตไม่มีความยาว โปรแกรมจึงไม่พบอะไรเลย :) ในตำแหน่งแรก กรณีนี้เรียกว่าการจับคู่ที่มีความยาวเป็นศูนย์ การจับคู่ดังกล่าวเกิดขึ้นในหลายกรณี: เมื่อบรรทัดอินพุตว่างเปล่า ที่จุดเริ่มต้นของบรรทัดอินพุต หลังอักขระสุดท้ายของบรรทัด หรือระหว่างอักขระในบรรทัด การแข่งขันที่มีความยาวเป็นศูนย์นั้นง่ายต่อการมองเห็น โดยเริ่มต้นและสิ้นสุดที่ตำแหน่งเดียวกัน มาดูตัวอย่างเพิ่มเติมของการจับคู่ที่มีความยาวเป็นศูนย์ มาสำรวจการจับคู่ที่มีความยาวเป็นศูนย์พร้อมตัวอย่างเพิ่มเติมกัน มาเปลี่ยนสตริงอินพุตเป็นอักขระ "a" และสังเกตเอฟเฟกต์ที่น่าสนใจ: ตัวระบุทั้งสามตัวพบอักขระ "a" แต่สองตัวแรกซึ่งอนุญาตให้ไม่มีอักขระพบการจับคู่ที่มีความยาวเป็นศูนย์ที่ตำแหน่ง 1 - หลังอักขระตัวสุดท้ายของสตริง สิ่งนี้เกิดขึ้นเนื่องจากโปรแกรมถือว่าอักขระ "a" เป็นสตริงและ "รัน" ผ่านอักขระนั้นจนกว่าจะไม่มีรายการที่ตรงกันอีกต่อไป โปรแกรมจะหรือไม่พบ "ไม่มีอะไร" ที่ส่วนท้ายของสตริง ทั้งนี้ขึ้นอยู่กับปริมาณที่ใช้ ตอนนี้เรามาเปลี่ยนสตริงอินพุตเป็นลำดับตัวอักษรห้าตัว "a": นิพจน์ทั่วไป a? ค้นหาการจับคู่ตัวอักษรแต่ละตัวในสตริงแยกกัน นิพจน์ a* ค้นหารายการที่ตรงกันสองรายการ ได้แก่ ลำดับอักขระ "a"' และการจับคู่ที่มีความยาวเป็นศูนย์ที่ตำแหน่ง 5 และสุดท้ายนิพจน์ทั่วไป a+ ค้นหาเฉพาะลำดับของอักขระ "a" โดยไม่พบ "ไม่มีอะไร" :) จะเกิดอะไรขึ้นหากป้อนสตริงที่มีอักขระต่างกันเป็นอินพุต ตัวอย่างเช่น "ababaaaab": อักขระ "b" อยู่ในตำแหน่ง 1, 3 และ 8 และโปรแกรมค้นหาการจับคู่ที่มีความยาวเป็นศูนย์ที่ตำแหน่งเหล่านี้ นิพจน์ทั่วไป ก? ไม่ใส่ใจกับ "b" แต่เพียงมองหาการมีอยู่ (หรือไม่มี) ของอักขระ "a" หากตัวระบุอนุญาตให้ไม่มี "a" อักขระทั้งหมดในสตริงอื่นที่ไม่ใช่ "a" จะแสดงเป็นการจับคู่ที่มีความยาวเป็นศูนย์ หากต้องการค้นหาลำดับของความยาวที่กำหนด เพียงระบุความยาวในวงเล็บปีกกา: นิพจน์ทั่วไป a{3} จะค้นหาลำดับของอักขระ "a" สามตัว ไม่พบสิ่งใดในบรรทัดแรกเนื่องจากมีตัว a ไม่เพียงพอในบรรทัด ตัวที่สองประกอบด้วยอักขระ 3 ตัวซึ่งโปรแกรมจะค้นหา การทดสอบครั้งที่สามยังค้นหาการจับคู่ที่จุดเริ่มต้นของสตริงด้วย ทุกอย่างที่อยู่หลังอักขระตัวที่ 3 ไม่ตรงกับนิพจน์ทั่วไป ในโค้ดด้านล่างเป็นไปตามนั้น และจะมีการจับคู่หลายรายการ: หากต้องการระบุความยาวลำดับขั้นต่ำ ให้ใช้:Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
ในตัวอย่างนี้ โปรแกรมค้นหารายการที่ตรงกันเพียงรายการเดียวเนื่องจากสตริงตรงตามข้อกำหนดความยาวลำดับขั้นต่ำคือ (3) อักขระ "a" สุดท้าย การตั้งค่าความยาวลำดับสูงสุด: ในตัวอย่างนี้ การจับคู่ครั้งแรกสิ้นสุดด้วยอักขระตัวที่หก คู่ที่ 2 มีอักขระตามหลังคู่ที่ 6 เพราะ เป็นไปตามข้อกำหนดความยาวขั้นต่ำ หากสตริงสั้นกว่าหนึ่งอักขระ ก็จะไม่มีการจับคู่ที่สอง
GO TO FULL VERSION