นิพจน์ทั่วไปเป็นรูปแบบหนึ่งที่สามารถนำไปใช้กับข้อความได้ (สตริงใน Java) Java จัดให้มี แพ็คเกจ
java.util.regexสำหรับการจับคู่นิพจน์ทั่วไป นิพจน์ทั่วไปมีความคล้ายคลึงกับภาษาโปรแกรม Perl มากและเรียนรู้ได้ง่ายมาก นิพจน์ทั่วไปตรงกับข้อความ (บางส่วน) หรือไม่ * หากนิพจน์ทั่วไปตรงกับข้อความ เราก็สามารถค้นหาได้ ** หากนิพจน์ทั่วไปเป็นแบบประสม เราจะทราบได้อย่างง่ายดายว่าส่วนใดของนิพจน์ทั่วไปตรงกับส่วนใดของข้อความ
ตัวอย่างแรก
นิพจน์ทั่วไป "
[a-z] +
" จะจับคู่ตัวอักษรพิมพ์เล็กทั้งหมดในข้อความ
[a-z]
หมายถึงอักขระใดๆ ตั้งแต่
a
ถึง
z
รวม และ
+
หมายถึงอักขระ "หนึ่งตัวขึ้นไป" สมมติว่าเราระบุสตริง "รหัส 2 เรียนรู้การสอน java" วิธีการทำเช่นนี้ใน Java ขั้นแรกคุณต้องสร้างเทมเพลต:
import java.util.regex.*;
Pattern p = Pattern.compile(“[a-z]+”);
ถัดไป คุณต้องสร้าง
matcher
ข้อความโดยการส่งข้อความบนไดอะแกรม:
Matcher m = p.matcher(“code 2 learn java tutorial”);
หมายเหตุ: ไม่มี
Pattern
Constructor
Matcher
เราสร้างมันขึ้นมาโดยใช้วิธีการ
Pattern
เรียน
Pattern Class:
วัตถุคลาสประกอบด้วยการเป็นตัวแทนของการแสดงออกปกติ คลาส Pattern ไม่ได้จัดเตรียมตัวสร้างสาธารณะใดๆ หากต้องการสร้างเทมเพลต คุณต้องเรียกหนึ่งในวิธีคงที่สาธารณะก่อน จากนั้นจึงส่งคืนอ็อบเจ็กต์ของ
Pattern
คลาส วิธีการเหล่านี้ใช้นิพจน์ทั่วไปเป็นอาร์กิวเมนต์
Matcher Class:
วัตถุ Finder คือกลไกที่ตีความรูปแบบและดำเนินการจับคู่กับสตริงอินพุต เช่นเดียวกับ
Pattern
ชั้นเรียน
Matcher
ไม่มีตัวสร้างสาธารณะ คุณได้รับวัตถุโดย
Matcher
การเรียกวิธีการ
matcher
บนวัตถุคลาส
Pattern
เมื่อเราทำตามขั้นตอนเหล่านี้เสร็จแล้ว และตอนนี้เรามี instance ของคลาสแล้ว
Matcher m
เราก็สามารถตรวจสอบได้ว่าพบรูปแบบหรือไม่ และหากพบ จะอยู่ที่ตำแหน่งใด เป็นต้น
m.matches()
คืนค่าเป็นจริงหากรูปแบบตรงกับสตริงทั้งหมด มิฉะนั้นจะเป็นเท็จ
m.lookingAt()
คืนค่าเป็นจริงหากรูปแบบตรงกับจุดเริ่มต้นของสตริง หากไม่เป็นเช่นนั้นจะเป็นเท็จ
m.find ()
คืนค่าเป็นจริงหากรูปแบบตรงกับส่วนใดส่วนหนึ่งของข้อความ
การหาคู่ที่ตรงกัน
หลังจากการจับคู่สำเร็จ
m.start()จะส่งกลับดัชนีของอักขระตัวแรกที่ตรงกัน และ
m.end()จะส่งกลับดัชนีของอักขระตัวสุดท้ายที่ตรงกันบวกหนึ่ง หากพยายามไม่สำเร็จและไม่พบการแข่งขัน
m.start()
พวกเขา
m.end()
จะโยน
IllegalStateException
- เท่านี้
RuntimeException
คุณก็ไม่ต้องจับมันแล้ว
อาจดูแปลกที่จะ
m.end()
ส่งคืนดัชนีของอักขระที่ตรงกันล่าสุดบวกหนึ่ง แต่นั่นคือสิ่งที่ส่วนใหญ่ของ
String
.
- ตัวอย่างเช่น,
“Now is the time“.substring(m.start(), m.end())
จะส่งกลับสตริงเดียวกัน มาดูโค้ดกัน:
import java.util.regex.*;
public class RegexTest {
public static void main(String args[]) {
String pattern = "[a-z]+";
String text = "code 2 learn java tutorial";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);
while(m.find()) {
System.out.print(text.substring(m.start(), m.end()) + "*");
}
}
}
Output: code*learn*java*tutorial*
วิธีการเพิ่มเติม
หากมีการแข่งขันเกิดขึ้น:
m.replaceFirst(replacement)
ส่งคืนสตริงใหม่ โดยที่สตริงย่อยแรกที่ตรงกับรูปแบบจะถูกแทนที่ด้วยreplacement
m.replaceAll(replacement)
ส่งคืนสตริงใหม่ โดยแต่ละสตริงย่อยที่ตรงกับรูปแบบจะถูกแทนที่
m.find(StartIndex)
ค้นหาคู่ถัดไปโดยเริ่มจากดัชนีที่ระบุ
m.reset()
รีเซ็ตเทมเพลต
m.reset(NewText)
รีเซ็ตตัวค้นหาและให้ข้อความใหม่ (อาจString
เป็นStringBuffer
หรือCharBuffer
)
ไวยากรณ์นิพจน์ทั่วไป
^
ตรงกับจุดเริ่มต้นของบรรทัด
$
จับคู่ส่วนท้ายของสตริง
.
จับคู่อักขระเดี่ยวใดๆ ยกเว้นขึ้นบรรทัดใหม่ การใช้ตัวเลือก m ช่วยให้สามารถจับคู่การขึ้นบรรทัดใหม่ได้
[...]
จับคู่อักขระเดี่ยวใดๆ ในวงเล็บ
[^ ...]
จับคู่อักขระเดี่ยวใดๆ ที่ไม่อยู่ในวงเล็บ
\A
เริ่มต้นทั้งบรรทัด
\z
สิ้นสุดทั้งบรรทัด
\Z
จุดสิ้นสุดของบรรทัดทั้งหมด ยกเว้นจุดสิ้นสุดของบรรทัดสุดท้าย
re*
จับคู่นิพจน์ก่อนหน้าตั้งแต่ 0 รายการขึ้นไป
re+
ตรงกับนิพจน์ก่อนหน้าอย่างน้อยหนึ่งรายการ
re?
จับคู่ 0 หรือ 1 กับตำแหน่งของนิพจน์ก่อนหน้า
re{n}
ตรงกับ N จำนวนครั้งของนิพจน์ก่อนหน้า
re{n,}
จับคู่ N รายการหรือมากกว่าของนิพจน์ก่อนหน้า
re{n, m}
จับคู่อย่างน้อย n และไม่เกิน m รายการของนิพจน์ก่อนหน้า
a|b
ตรงกับ a หรือ b
(re)
กลุ่มของนิพจน์ทั่วไปและการจดจำข้อความที่พบ
(?: re)
กลุ่มของนิพจน์ทั่วไปที่ไม่จำข้อความที่พบ
(?> re)
จับคู่รูปแบบอิสระโดยไม่มีผลตอบแทน
\w
จับคู่ตัวอักษรและตัวเลข [a-zA-Z_0-9]
\W
สิ่งเหล่านี้ไม่ใช่ตัวอักษรหรือตัวเลข
\s
จับคู่ช่องว่าง เทียบเท่ากับ [\t\n\r\f]
\S
ไม่ใช่อักขระช่องว่าง
\d
จับคู่ตัวเลข เทียบเท่ากับ [0-9]
\D
ไม่ตรงกับตัวเลข.
\G
ตรงกับแต้มนัดสุดท้าย
\n
ตรงกับการขึ้นบรรทัดใหม่
\b
จับคู่ที่ขอบเขตคำ
\B
ตรงกันไม่อยู่ในขอบเขตคำ
\n, \t, etc.
ขึ้นบรรทัดใหม่ การขึ้นบรรทัดใหม่ แท็บ ฯลฯ
\Q
อ้างอิงอักขระทั้งหมดก่อน \E
\E
ใบเสนอราคาเริ่มต้นด้วย \Q ลงท้าย
GO TO FULL VERSION