นิพจน์ทั่วไปคือสูตรที่ใช้รูปแบบบางอย่างเพื่อจับคู่ประเภทของสตริง นิพจน์ทั่วไปประกอบด้วยอักขระธรรมดาบางตัวและอักขระเมตาบางตัว อักขระสามัญประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กและตัวเลข ในขณะที่อักขระเมตามีความหมายพิเศษ ไม่ว่าจะเป็นแพลตฟอร์ม .Net หรือแพลตฟอร์ม Java ความหมายที่แสดงโดยนิพจน์ทั่วไปจะเหมือนกัน ด้านล่างนี้เราจะวิเคราะห์ฟังก์ชันของนิพจน์ทั่วไปของ Java เป็นหลัก การใช้งานเฉพาะ ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับคุณและมีไว้เพื่อการอ้างอิงเท่านั้น
ตั้งแต่ jdk1.4 เปิดตัวแพ็คเกจ java.util.regex มันทำให้เรามีแพลตฟอร์มแอปพลิเคชันนิพจน์ทั่วไป Java ที่ดี เนื่องจากนิพจน์ทั่วไปของ Java เป็นระบบที่ซับซ้อนมาก
//แบ็กสแลช
/t ช่วงเวลา('/u0009')
/n ป้อนบรรทัด ('/u000A')
/r เข้าสู่('/u000D')
/d เทียบเท่ากับตัวเลข [0-9]
/D ไม่ใช่ตัวเลขเทียบเท่ากับ [^0-9]
/s ช่องว่าง [/t/n/x0B/f/r]
/S อักขระที่ไม่ใช่ช่องว่าง [^/t/n/x0B/f/r]
/w อักขระแต่ละตัว [a-zA-Z_0-9]
/W อักขระที่ไม่แยกกัน [^a-zA-Z_0-9]
/f ป้อนอักขระฟีดแบบฟอร์ม
/e หลบหนี
/b ขอบเขตคำ
/B ขอบเขตที่ไม่ใช่คำ
/G จบแมตช์ที่แล้ว
^ เริ่มต้นด้วยข้อจำกัด
เงื่อนไข ^java จำกัดอยู่ที่อักขระที่ขึ้นต้นด้วย Java
$ คือจุดสิ้นสุดของข้อจำกัด
เงื่อนไข java$ ถูกจำกัดให้ java เป็นอักขระลงท้าย
เงื่อนไขจะจำกัดอักขระตัวเดียวยกเว้น /n
java.. เงื่อนไขถูกจำกัดไว้ที่อักขระสองตัวใดๆ หลัง java ยกเว้นการขึ้นบรรทัดใหม่
เพิ่มข้อจำกัดเฉพาะ "[]"
เงื่อนไข [az] จำกัดอยู่ที่อักขระหนึ่งตัวในช่วงตัวพิมพ์เล็ก a ถึง z
เงื่อนไข [AZ] จำกัดอยู่ที่อักขระหนึ่งตัวในช่วง A ถึง Z ตัวพิมพ์ใหญ่
เงื่อนไข [a-zA-Z] จำกัดอยู่ที่อักขระหนึ่งตัวในช่วงตัวพิมพ์เล็ก a ถึง z หรือตัวพิมพ์ใหญ่ A ถึง Z
[0-9] เงื่อนไขจำกัดอยู่ที่หนึ่งอักขระในช่วงตัวพิมพ์เล็ก 0 ถึง 9
[0-9a-z] เงื่อนไขถูกจำกัดไว้ที่หนึ่งอักขระในช่วงตัวพิมพ์เล็ก 0 ถึง 9 หรือ a ถึง z
[0-9[az]] เงื่อนไขจำกัดอยู่ที่หนึ่งอักขระ (จุดตัด) ในช่วงตัวพิมพ์เล็ก 0 ถึง 9 หรือ a ถึง z
เพิ่ม ^ ไปที่ [] แล้วเพิ่มข้อจำกัดอื่น "[^]"
เงื่อนไข [^az] จำกัดอยู่ที่หนึ่งอักขระในช่วงที่ไม่ใช่ตัวพิมพ์เล็ก a ถึง z
เงื่อนไข [^AZ] จำกัดอยู่ที่อักขระหนึ่งตัวในช่วงระหว่าง A ถึง Z ที่ไม่ใช่ตัวพิมพ์ใหญ่
[^a-zA-Z] เงื่อนไขจำกัดอยู่ที่หนึ่งอักขระในช่วงที่ไม่ใช่ตัวพิมพ์เล็ก a ถึง z หรือตัวพิมพ์ใหญ่ A ถึง Z
[^0-9] เงื่อนไขถูกจำกัดไว้ที่หนึ่งอักขระในช่วงที่ไม่ใช่ตัวพิมพ์เล็ก 0 ถึง 9
[^0-9a-z] เงื่อนไขถูกจำกัดไว้ที่หนึ่งอักขระในช่วงที่ไม่ใช่ตัวพิมพ์เล็ก 0 ถึง 9 หรือ a ถึง z
[^0-9[az]] เงื่อนไขถูกจำกัดไว้ที่หนึ่งอักขระ (จุดตัด) ในช่วงที่ไม่ใช่ตัวพิมพ์เล็ก 0 ถึง 9 หรือ a ถึง z
เมื่อเงื่อนไขข้อจำกัดคืออักขระใดตัวหนึ่งปรากฏมากกว่า 0 ครั้ง คุณสามารถใช้ "*"
J* มากกว่า 0J
.* 0 อักขระขึ้นไป
J.* มากกว่า 0 ตัวอักษรระหว่าง DJ และ D
เมื่อเงื่อนไขข้อจำกัดคืออักขระใดตัวหนึ่งปรากฏมากกว่าหนึ่งครั้ง คุณสามารถใช้ "+"
J+ 1 ขึ้นไป
.+ 1 ตัวขึ้นไป
J.+1 หรือมากกว่าตัวละครระหว่าง DJ และ D
เมื่อข้อจำกัดคืออักขระเฉพาะปรากฏ 0 ครั้งขึ้นไป คุณสามารถใช้ "?"
JA? J หรือ JA ปรากฏขึ้น
จำกัดจำนวนการปรากฏติดต่อกันของอักขระ "{a}" ที่ระบุ
เจ{2} เจเจ
เจ{3} เจเจ
มีอักขระมากกว่าตัวหนึ่ง และ "{a,}"
J{3,} JJJ,JJJJ,JJJJJ,???(J อยู่ร่วมกันมากกว่า 3 ครั้ง)
มากกว่าอักขระและน้อยกว่า b อักขระ "{a,b}"
เจ{3,5} เจเจเจ หรือ เจเจเจ หรือ เจเจเจเจ
เลือกหนึ่งในสอง "|"
J|AJ หรือ A
Java|สวัสดี Java หรือสวัสดี
"()" ระบุประเภทชุดค่าผสม <BR>ตัวอย่างเช่น หากฉันค้นหาข้อมูลระหว่าง <a href></a> ใน <a href="index.html/">ดัชนี</a> ก็สามารถเขียนได้ เป็น <a .*href=/".*/">(.+?)</a>
เมื่อใช้ฟังก์ชัน Pattern.compile คุณสามารถเพิ่มพารามิเตอร์ที่ควบคุมลักษณะการจับคู่ของนิพจน์ทั่วไปของ Java ได้:
รูปแบบ Pattern.compile (String regex, int flag)
ช่วงค่าของแฟล็กจะเป็นดังนี้:
Pattern.CANON_EQ การจับคู่จะได้รับการพิจารณาก็ต่อเมื่อ "การสลายตัวตามรูปแบบบัญญัติ" ของอักขระทั้งสองเหมือนกันทุกประการ ตัวอย่างเช่น หลังจากใช้แฟล็กนี้ นิพจน์ "a/u030A" จะตรงกับ "?" ตามค่าเริ่มต้น จะไม่พิจารณา "ความเทียบเท่าตามรูปแบบบัญญัติ"
Pattern.CASE_INSENSITIVE(?i)
ตามค่าเริ่มต้น การจับคู่แบบไม่คำนึงถึงตัวพิมพ์จะใช้ได้กับชุดอักขระ US-ASCII เท่านั้น การตั้งค่าสถานะนี้ทำให้นิพจน์ถูกจับคู่โดยไม่คำนึงถึงตัวพิมพ์ หากต้องการดำเนินการจับคู่อักขระ Unicode ที่ชัดเจน เพียงรวม UNICODE_CASE เข้ากับแฟล็กนี้
Pattern.ความคิดเห็น(?x)
ในโหมดนี้ อักขระเว้นวรรคในนิพจน์ทั่วไปของ Java จะถูกละเว้นเมื่อจับคู่ (หมายเหตุผู้แปล: ไม่ได้อ้างถึง "//s" ในนิพจน์ แต่หมายถึงช่องว่าง แท็บ การขึ้นบรรทัดใหม่ ฯลฯ ในนิพจน์ ) . ความคิดเห็นเริ่มต้นด้วย # และดำเนินต่อไปจนจบบรรทัด โหมดบรรทัด Unix สามารถเปิดใช้งานได้ผ่านแฟล็กแบบฝัง
Pattern.DOTALL(?s)
ในโหมดนี้ นิพจน์ '.' สามารถจับคู่อักขระใดก็ได้ รวมถึงการสิ้นสุดบรรทัดด้วย ตามค่าเริ่มต้น นิพจน์ '.' จะไม่ตรงกับตัวสิ้นสุดบรรทัด
Pattern.MULTILINE(?m)
ในโหมดนี้ '^' และ '$' จะจับคู่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัดตามลำดับ นอกจากนี้ '^' ยังคงตรงกับจุดเริ่มต้นของสตริง และ '$' ยังจับคู่ส่วนท้ายของสตริงด้วย ตามค่าเริ่มต้น นิพจน์ทั้งสองนี้จะจับคู่เฉพาะจุดเริ่มต้นและจุดสิ้นสุดของสตริงเท่านั้น
รูปแบบ UNICODE_CASE(?u)
ในโหมดนี้ หากคุณเปิดใช้งานแฟล็ก CASE_INSENSITIVE ด้วย มันจะจับคู่อักขระ Unicode โดยไม่คำนึงถึงขนาดตัวพิมพ์ ตามค่าเริ่มต้น การจับคู่แบบไม่สนใจตัวพิมพ์จะใช้ได้กับชุดอักขระ US-ASCII เท่านั้น
Pattern.UNIX_LINES(?d)
ในโหมดนี้ เฉพาะ '/n' เท่านั้นที่ถือเป็นการแบ่งบรรทัด และจับคู่กับ '.', '^' และ '$' นอกเหนือจากแนวคิดที่คลุมเครือแล้ว ต่อไปนี้เป็นกรณีการใช้งานทั่วไปของ Java ง่ายๆ:
◆ตัวอย่างเช่น เมื่อสตริงมีการตรวจสอบความถูกต้อง