นิพจน์ทั่วไปกำหนดรูปแบบของสตริง
นิพจน์ทั่วไปสามารถใช้เพื่อค้นหา แก้ไข หรือจัดการข้อความได้
นิพจน์ทั่วไปไม่ได้จำกัดอยู่เพียงภาษาเดียว แต่มีความแตกต่างเล็กน้อยในแต่ละภาษา
นิพจน์ทั่วไปของ Java มีความคล้ายคลึงกับ Perl มากที่สุด
แพ็คเกจ java.util.regex ส่วนใหญ่ประกอบด้วยสามคลาสต่อไปนี้:
คลาสรูปแบบ:
วัตถุรูปแบบเป็นตัวแทนที่คอมไพล์ของนิพจน์ทั่วไป คลาส Pattern ไม่มีตัวสร้างสาธารณะ หากต้องการสร้างวัตถุ Pattern คุณต้องเรียกวิธีการคอมไพล์แบบคงที่สาธารณะก่อน ซึ่งจะส่งคืนวัตถุ Pattern เมธอดนี้ยอมรับนิพจน์ทั่วไปเป็นพารามิเตอร์แรก
คลาสตัวจับคู่:
วัตถุ Matcher เป็นเครื่องมือที่ตีความและจับคู่สตริงอินพุต เช่นเดียวกับคลาส Pattern Matcher ไม่มีตัวสร้างสาธารณะ คุณต้องเรียกเมธอด matcher ของวัตถุ Pattern เพื่อรับวัตถุ Matcher
รูปแบบไวยากรณ์ข้อยกเว้น:
PatternSyntaxException เป็นคลาสข้อยกเว้นที่ไม่บังคับซึ่งแสดงถึงข้อผิดพลาดทางไวยากรณ์ในรูปแบบนิพจน์ทั่วไป
การจับกลุ่มเป็นวิธีหนึ่งในการปฏิบัติต่ออักขระหลายตัวเป็นหน่วยเดียว ซึ่งสร้างขึ้นโดยการจัดกลุ่มอักขระภายในวงเล็บ
ตัวอย่างเช่น นิพจน์ทั่วไป (dog) จะสร้างกลุ่มเดียวที่มี "d", "o" และ "g"
กลุ่มการจับจะถูกกำหนดหมายเลขโดยการนับวงเล็บเปิดจากซ้ายไปขวา ตัวอย่างเช่น ในนิพจน์ ((A)(B(C))) มีสี่กลุ่มดังกล่าว:
((ก)(ข(ค)))
(ก)
(ข(ค))
(ค)
คุณสามารถตรวจสอบจำนวนกลุ่มในนิพจน์ได้โดยการเรียกเมธอด groupCount ของวัตถุที่จับคู่ เมธอด groupCount ส่งกลับค่า int ซึ่งบ่งชี้ว่าวัตถุที่จับคู่ในปัจจุบันมีกลุ่มการจับหลายกลุ่ม
นอกจากนี้ยังมีกลุ่มพิเศษ (กลุ่ม 0) ซึ่งแสดงถึงนิพจน์ทั้งหมดเสมอ กลุ่มไม่รวมอยู่ในค่าส่งคืนของ groupCount
ตัวอย่างต่อไปนี้แสดงวิธีการค้นหาสตริงตัวเลขจากสตริงที่กำหนด:
นำเข้า java.util.regex.Matcher;
นำเข้า java.util.regex.Pattern;
RegexMatches คลาสสาธารณะ
-
โมฆะคงสาธารณะหลัก (สตริง args [] ) {
// ค้นหาสตริงตามรูปแบบที่ระบุ String line = "คำสั่งซื้อนี้ถูกวางไว้สำหรับ QT3000! OK?";
รูปแบบสตริง = "(.*)(\d+)(.*)";
// สร้างวัตถุรูปแบบ Pattern r = Pattern.compile (รูปแบบ);
// ตอนนี้สร้างวัตถุ matcher Matcher m = r.matcher(line);
ถ้า (m.find( )) {
System.out.println("ค่าที่พบ: " + m.group(0) );
System.out.println("ค่าที่พบ: " + m.group(1) );
System.out.println("ค่าที่พบ: " + m.group(2) );
} อื่น {
System.out.println("ไม่ตรงกัน");
-
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
พบมูลค่า: คำสั่งซื้อนี้ถูกวางสำหรับ QT3000! ตกลงไหม?
มูลค่าที่พบ: คำสั่งซื้อนี้ถูกวางสำหรับ QT300
พบมูลค่า: 0
อักขระ | แสดงให้เห็น |
---|---|
- | ทำเครื่องหมายอักขระถัดไปเป็นอักขระพิเศษ ข้อความ การอ้างอิงด้านหลัง หรืออักขระหลีกฐานแปด ตัวอย่างเช่น "n" จะจับคู่อักขระ "n" "n" จับคู่อักขระขึ้นบรรทัดใหม่ ลำดับ "\" ตรงกับ "" และ "(" ตรงกับ "(" |
- | จับคู่จุดเริ่มต้นของสตริงอินพุต หากตั้งค่าคุณสมบัติ Multiline ของวัตถุ RegExp แล้ว ^ จะจับคู่ตำแหน่งหลัง "n" หรือ "r" ด้วย |
- | จับคู่ส่วนท้ายของสตริงอินพุต หากตั้งค่าคุณสมบัติ Multiline ของวัตถุ RegExp แล้ว $ จะจับคู่ตำแหน่งก่อน "n" หรือ "r" ด้วย |
- | จับคู่อักขระก่อนหน้าหรือนิพจน์ย่อยเป็นศูนย์หรือนานกว่านั้น ตัวอย่างเช่น zo* จะจับคู่ "z" และ "zoo" * เทียบเท่ากับ {0,} |
- | จับคู่อักขระก่อนหน้าหรือนิพจน์ย่อยอย่างน้อยหนึ่งครั้ง ตัวอย่างเช่น "zo+" จะจับคู่ "zo" และ "zoo" แต่ไม่ใช่ "z" + เทียบเท่ากับ {1,} |
- | จับคู่อักขระนำหน้าหรือนิพจน์ย่อยเป็นศูนย์หรือหนึ่งครั้ง ตัวอย่างเช่น "do(es)?" ตรงกับ "do" หรือ "do" ใน "does" ? เทียบเท่ากับ {0,1} |
{ n } | n เป็นจำนวนเต็มที่ไม่เป็นลบ ตรงกัน n ครั้ง ตัวอย่างเช่น "o{2}" ไม่ตรงกับ "o" ใน "Bob" แต่จะตรงกับ "o" ทั้งสองใน "food" |
{ n ,} | n เป็นจำนวนเต็มที่ไม่เป็นลบ จับคู่อย่างน้อย n ครั้ง ตัวอย่างเช่น "o{2,}" ไม่ตรงกับ "o" ใน "Bob" แต่ตรงกับ o ทั้งหมดใน "foooood" "o{1,}" เทียบเท่ากับ "o+" "o{0,}" เทียบเท่ากับ "o*" |
{ n , ม } | M และ n เป็นจำนวนเต็มไม่ติดลบ โดยที่ n <= m จับคู่อย่างน้อย n ครั้งและมากที่สุด m ครั้ง ตัวอย่างเช่น "o{1,3}" จะจับคู่ o สามตัวแรกใน "fooooood" 'o{0,1}' เทียบเท่ากับ 'o?' หมายเหตุ: คุณไม่สามารถแทรกช่องว่างระหว่างเครื่องหมายจุลภาคและตัวเลขได้ |
- | เมื่ออักขระนี้ตามหลังตัวระบุอื่นทันที (*, +, ?, { n }, { n ,}, { n , m }) รูปแบบการจับคู่จะเป็น "ไม่โลภ" รูปแบบ "ไม่โลภ" จะตรงกับสตริงที่สั้นที่สุดที่เป็นไปได้ ในขณะที่รูปแบบเริ่มต้น "โลภ" จะตรงกับสตริงที่ยาวที่สุดที่เป็นไปได้ ตัวอย่างเช่น ในสตริง "oooo" "o+?" จะจับคู่กับ "o" เพียงตัวเดียว ในขณะที่ "o+" จะจับคู่กับ "o" ทั้งหมด |
- | จับคู่อักขระเดี่ยวใดๆ ยกเว้น "rn" หากต้องการจับคู่อักขระใดๆ รวมถึง "rn" ให้ใช้รูปแบบเช่น "[sS]" |
( ลวดลาย ) | จับคู่ รูปแบบ และบันทึกนิพจน์ย่อยที่ตรงกัน การแข่งขันที่บันทึกไว้สามารถดึงมาจากคอลเลกชัน "การแข่งขัน" ที่เป็นผลลัพธ์ได้โดยใช้แอตทริบิวต์ $0…$9 หากต้องการจับคู่อักขระวงเล็บปีกกา ( ) ให้ใช้ "(" หรือ ")" |
(?: ลวดลาย ) | นิพจน์ย่อยที่ตรงกับ รูปแบบ แต่ไม่ได้บันทึกการจับคู่ กล่าวคือ เป็นการจับคู่ที่ไม่สามารถจับภาพได้ และไม่จัดเก็บการจับคู่ไว้เพื่อใช้ในภายหลัง สิ่งนี้มีประโยชน์เมื่อรวมส่วนของรูปแบบโดยใช้อักขระ "หรือ" (|) ตัวอย่างเช่น 'industr(?:y|ies) เป็นการแสดงออกที่ประหยัดมากกว่า 'industry|industries' |
(?= รูปแบบ ) | นิพจน์ย่อยที่ดำเนินการค้นหา lookahead แบบไปข้างหน้าซึ่งตรงกับสตริงที่จุดเริ่มต้นของสตริงที่ตรงกับ รูปแบบ เป็นการจับคู่ที่ไม่สามารถจับภาพได้ กล่าวคือ การแข่งขันที่ไม่สามารถจับภาพเพื่อใช้ในภายหลังได้ ตัวอย่างเช่น 'Windows (?=95|98|NT|2000)' จะจับคู่ "Windows" ใน "Windows 2000" แต่ไม่ตรงกับ "Windows" ใน "Windows 3.1" การค้นหาการคาดการณ์ไม่ใช้อักขระ กล่าวคือ หลังจากที่การแข่งขันเกิดขึ้น การจับคู่ครั้งถัดไปจะถูกค้นหาทันทีหลังจากการจับคู่ครั้งก่อน ไม่ใช่หลังจากอักขระที่ประกอบกันเป็นการคาดการณ์ล่วงหน้า |
(?! ลวดลาย ) | นิพจน์ย่อยที่ดำเนินการค้นหา lookahead แบบย้อนกลับที่ตรงกับสตริงการค้นหาที่ไม่ได้อยู่ที่จุดเริ่มต้นของสตริงที่ตรงกับ รูปแบบ เป็นการจับคู่ที่ไม่สามารถจับภาพได้ กล่าวคือ การแข่งขันที่ไม่สามารถจับภาพเพื่อใช้ในภายหลังได้ ตัวอย่างเช่น 'Windows (?!95|98|NT|2000)' จะจับคู่ "Windows" ใน "Windows 3.1" แต่ไม่ตรงกับ "Windows" ใน "Windows 2000" การค้นหาการคาดการณ์ไม่ใช้อักขระ กล่าวคือ หลังจากที่การแข่งขันเกิดขึ้น การจับคู่ครั้งถัดไปจะถูกค้นหาทันทีหลังจากการจับคู่ครั้งก่อน ไม่ใช่หลังจากอักขระที่ประกอบกันเป็นการคาดการณ์ล่วงหน้า |
x | ย | จับคู่ x หรือ y ตัวอย่างเช่น 'z|food' ตรงกับ "z" หรือ "food" '(z|f)ood' ตรงกับ "zoood" หรือ "food" |
[ xyz ] | ชุดตัวละคร. จับคู่อักขระใดๆ ที่มีอยู่ใน . ตัวอย่างเช่น "[abc]" จะจับคู่ "a" ใน "plain" |
[^ xyz ] | ชุดอักขระย้อนกลับ จับคู่อักขระใดๆ ที่ไม่รวมอยู่ด้วย ตัวอย่างเช่น "[^abc]" จะจับคู่ "p", "l", "i" และ "n" ใน "plain" |
[ อัซ ] | ช่วงอักขระ จับคู่อักขระใดๆ ภายในช่วงที่ระบุ ตัวอย่างเช่น "[az]" จะจับคู่อักษรตัวพิมพ์เล็กใดๆ ในช่วง "a" ถึง "z" |
[^ อาซ ] | อักขระช่วงย้อนกลับ จับคู่อักขระใดๆ ที่ไม่อยู่ในช่วงที่ระบุ ตัวอย่างเช่น "[^az]" จะจับคู่อักขระใดๆ ที่ไม่อยู่ในช่วง "a" ถึง "z" |
ข | จับคู่ขอบเขตคำ ซึ่งก็คือตำแหน่งระหว่างคำและช่องว่าง ตัวอย่างเช่น "erb" จะจับคู่ "er" ใน "never" แต่ไม่ใช่ "er" ใน "กริยา" |
บี | การจับคู่ขอบเขตที่ไม่ใช่คำ "erB" จะจับคู่ "er" ใน "กริยา" แต่ไม่ใช่ "er" ใน "never" |
ซี x | จับคู่อักขระควบคุมที่ระบุโดย x ตัวอย่างเช่น cM ตรงกับ Control-M หรืออักขระขึ้นบรรทัดใหม่ ค่าของ x ต้องอยู่ระหว่าง AZ หรือ az หากไม่เป็นเช่นนั้น ระบบจะถือว่า c เป็นอักขระ "c" เอง |
d | การจับคู่อักขระตัวเลข เทียบเท่ากับ [0-9] |
D | จับคู่อักขระที่ไม่ใช่ตัวเลข เทียบเท่ากับ [^0-9] |
ฉ | ฟีดแบบฟอร์มตรงกัน เทียบเท่ากับ x0c และ cL |
n | การจับคู่ขึ้นบรรทัดใหม่ เทียบเท่ากับ x0a และ cJ |
r | จับคู่อักขระการขึ้นบรรทัดใหม่ เทียบเท่ากับ x0d และ cM |
s | จับคู่อักขระช่องว่างใดๆ รวมถึงช่องว่าง แท็บ ฟีดแบบฟอร์ม ฯลฯ เทียบเท่ากับ [fnrtv] |
ส | จับคู่อักขระที่ไม่ใช่ช่องว่าง เทียบเท่ากับ [^fnrtv] |
t | การจับคู่แท็บ เทียบเท่ากับ x09 และ cI |
v | การจับคู่แท็บแนวตั้ง เทียบเท่ากับ x0b และ cK |
w | จับคู่อักขระประเภทใดก็ได้ รวมถึงขีดล่าง เทียบเท่ากับ "[A-Za-z0-9_]" |
ว | จับคู่อักขระที่ไม่ใช่คำใดๆ เทียบเท่ากับ "[^A-Za-z0-9_]" |
xn | จับคู่ n โดยที่ n คือโค้ด Escape เลขฐานสิบหก รหัสหลีกเลขฐานสิบหกต้องมีความยาวสองหลักพอดี ตัวอย่างเช่น "x41" ตรงกับ "A" "x041" เทียบเท่ากับ "x04"&"1" อนุญาตให้ใช้รหัส ASCII ในนิพจน์ทั่วไป |
หมายเลข | จับคู่ num โดยที่ num เป็นจำนวนเต็มบวก การอ้างอิงด้านหลังเพื่อจับภาพการแข่งขัน ตัวอย่างเช่น "(.)1" จะจับคู่อักขระที่เหมือนกันสองตัวติดต่อกัน |
n | ระบุโค้ด Escape ฐานแปดหรือการอ้างอิงย้อนกลับ ถ้า n นำหน้าด้วยการจับนิพจน์ย่อยเป็นอย่างน้อย n แล้ว n จะเป็นการอ้างอิงกลับ มิฉะนั้น ถ้า n เป็นเลขฐานแปด (0-7) ดังนั้น n ก็คือรหัส Escape ฐานแปด |
นาโนเมตร | ระบุโค้ด Escape ฐานแปดหรือการอ้างอิงย้อนกลับ ถ้า nm นำหน้าด้วยอย่างน้อย nm ที่จะจับนิพจน์ย่อย ดังนั้น nm จะเป็นการอ้างอิงกลับ ถ้า nm นำหน้าด้วยการจับ n เป็นอย่างน้อย n คือการอ้างอิงด้านหลังตามด้วยอักขระ m หากไม่มีเงื่อนไขใดๆ ก่อนหน้านี้ nm จะตรงกับค่าฐานแปด nm โดยที่ n และ m เป็นเลขฐานแปด (0-7) |
nml | เมื่อ n เป็นเลขฐานแปด (0-3) และ m และ l เป็นเลขฐานแปด (0-7) ให้จับคู่รหัสหลีกฐานแปด nml |
คุณ | จับคู่ n โดยที่ n คืออักขระ Unicode ที่แสดงเป็นเลขฐานสิบหกสี่หลัก ตัวอย่างเช่น u00A9 ตรงกับสัญลักษณ์ลิขสิทธิ์ (©) |
วิธีดัชนีให้ค่าดัชนีที่มีประโยชน์ซึ่งระบุตำแหน่งที่ตรงกันในสตริงอินพุตที่พบ:
หมายเลขซีเรียล | วิธีการและคำแนะนำ |
---|---|
1 | public int start() ส่งคืนดัชนีเริ่มต้นของการแข่งขันครั้งก่อน |
2 | public int start(int group) ส่งกลับดัชนีเริ่มต้นของลำดับย่อยที่จับโดยกลุ่มที่กำหนดระหว่างการดำเนินการจับคู่ครั้งก่อน |
3 | public int end() ส่งคืนค่าชดเชยหลังอักขระที่ตรงกันตัวสุดท้าย |
4 | public int end(int group) ส่งกลับค่าชดเชยหลังอักขระตัวสุดท้ายของลำดับย่อยที่กลุ่มที่กำหนดจับไว้ระหว่างการดำเนินการจับคู่ครั้งก่อน |
วิธีการวิจัยจะตรวจสอบสตริงอินพุตและส่งคืนค่าบูลีนเพื่อระบุว่าพบรูปแบบหรือไม่:
หมายเลขซีเรียล | วิธีการและคำแนะนำ |
---|---|
1 | บูลีนสาธารณะ lookAt() พยายามจับคู่ลำดับอินพุตโดยเริ่มจากจุดเริ่มต้นของช่วงจนถึงรูปแบบนี้ |
2 | public boolean find() พยายามค้นหาลำดับถัดไปของลำดับอินพุตที่ตรงกับรูปแบบนี้ |
3 | ค้นหาบูลีนสาธารณะ (เริ่มต้น int) รีเซ็ตตัวจับคู่นี้ จากนั้นพยายามค้นหาลำดับถัดไปของลำดับอินพุตโดยเริ่มต้นที่ดัชนีที่ระบุซึ่งตรงกับรูปแบบนี้ |
4 | การจับคู่บูลีนสาธารณะ () พยายามจับคู่ช่วงทั้งหมดด้วยรูปแบบ |
วิธีการแทนที่เป็นวิธีการแทนที่ข้อความในสตริงอินพุต:
หมายเลขซีเรียล | วิธีการและคำแนะนำ |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) ใช้ขั้นตอนการเพิ่มและการแทนที่ที่ไม่ใช่เทอร์มินัล |
2 | public StringBuffer appendTail(StringBuffer sb) ใช้ขั้นตอนการเพิ่มและเปลี่ยนเทอร์มินัล |
3 | public String แทนที่ทั้งหมด (การแทนที่สตริง) แทนที่ทุกลำดับย่อยของลำดับอินพุตที่มีรูปแบบตรงกับสตริงการแทนที่ที่กำหนด |
4 | สตริงสาธารณะreplaceFirst(การแทนที่สตริง) แทนที่ลำดับย่อยแรกของลำดับอินพุตที่มีรูปแบบตรงกับสตริงการแทนที่ที่กำหนด |
5 | สาธารณะสตริง quoteReplacement(String s) ส่งคืนสตริงการแทนที่ตามตัวอักษรของสตริงที่ระบุ เมธอดนี้ส่งคืนสตริงที่ทำงานเหมือนกับสตริงสัญพจน์ที่ส่งผ่านไปยังเมธอด appendReplacement ของคลาส Matcher |
นี่คือตัวอย่างการนับจำนวนคำว่า "cat" ในสตริงอินพุต:
นำเข้า java.util.regex.Matcher;
นำเข้า java.util.regex.Pattern;
RegexMatches คลาสสาธารณะ
-
สตริงสุดท้ายแบบคงที่ส่วนตัว REGEX = "\bcat\b";
อินพุตสตริงสุดท้ายแบบคงที่ส่วนตัว =
"แมว แมว แมว แมว แมว";
โมฆะคงสาธารณะหลัก (สตริง args [] ) {
รูปแบบ p = Pattern.compile (REGEX);
Matcher m = p.matcher(INPUT); // รับวัตถุ matcher int count = 0;
ในขณะที่ (m.find ()) {
นับ++;
System.out.println("จับคู่หมายเลข "+นับ);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
-
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
ตรงกับหมายเลข 1
เริ่มต้น(): 0
สิ้นสุด(): 3
ตรงกับหมายเลข 2
เริ่มต้น(): 4
สิ้นสุด(): 7
ตรงกับหมายเลข 3
เริ่มต้น(): 8
สิ้นสุด(): 11
ตรงกับหมายเลข 4
เริ่มต้น(): 19
สิ้นสุด(): 22
คุณจะเห็นว่าตัวอย่างนี้ใช้ขอบเขตคำเพื่อให้แน่ใจว่าตัวอักษร "c" "a" "t" ไม่ได้เป็นเพียงสตริงย่อยของคำที่ยาวกว่า นอกจากนี้ยังให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับตำแหน่งในสตริงอินพุตที่การจับคู่เกิดขึ้น
วิธีการเริ่มต้นส่งคืนดัชนีเริ่มต้นของลำดับย่อยที่กลุ่มที่กำหนดบันทึกไว้ในระหว่างการดำเนินการจับคู่ครั้งก่อน และวิธีการสิ้นสุดจะเพิ่มหนึ่งรายการในดัชนีของอักขระที่ตรงกันล่าสุด
ทั้งวิธีการ Match และ LookingAt ใช้เพื่อพยายามจับคู่รูปแบบลำดับอินพุต ข้อแตกต่างระหว่างทั้งสองคือการจับคู่ต้องใช้ลำดับทั้งหมดจึงจะตรงกัน ในขณะที่ lookAt ไม่ต้องจับคู่
ทั้งสองวิธีนี้มักใช้ที่จุดเริ่มต้นของสตริงอินพุต
เราใช้ตัวอย่างต่อไปนี้เพื่ออธิบายฟังก์ชันนี้:
นำเข้า java.util.regex.Matcher;
นำเข้า java.util.regex.Pattern;
RegexMatches คลาสสาธารณะ
-
สตริงสุดท้ายแบบคงที่ส่วนตัว REGEX = "foo";
ส่วนตัว INPUT สตริงสุดท้ายคงคงที่ = "fooooooo";
รูปแบบรูปแบบคงที่ส่วนตัว
Matcher Matcher ส่วนตัวแบบคงที่
โมฆะคงสาธารณะหลัก (สตริง args [] ) {
pattern = Pattern.compile (REGEX);
matcher = pattern.matcher(อินพุต);
System.out.println("REGEX ปัจจุบันคือ: "+REGEX);
System.out.println("อินพุตปัจจุบันคือ: "+อินพุต);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
REGEX ปัจจุบันคือ: foo
อินพุตปัจจุบันคือ: fooooooooooo
กำลังดู (): จริง
ตรงกัน (): เท็จ
วิธีการแทนที่FirstและreplaceAllใช้เพื่อแทนที่ข้อความที่ตรงกับนิพจน์ทั่วไป ความแตกต่างก็คือการแทนที่ครั้งแรกจะแทนที่นัดแรกและแทนที่ทั้งหมดจะแทนที่การแข่งขันทั้งหมด
ตัวอย่างต่อไปนี้จะอธิบายฟังก์ชันการทำงานนี้:
นำเข้า java.util.regex.Matcher;
นำเข้า java.util.regex.Pattern;
RegexMatches คลาสสาธารณะ
-
สตริงคงที่ส่วนตัว REGEX = "สุนัข";
สตริงคงที่ส่วนตัว INPUT = "สุนัขพูดว่า meow"
"สุนัขทุกตัวร้องเหมียว";
สตริงคงที่ส่วนตัว REPLACE = "cat";
โมฆะคงที่สาธารณะ main (String [] args) {
รูปแบบ p = Pattern.compile (REGEX);
//รับวัตถุที่จับคู่
Matcher m = p.matcher(อินพุต);
INPUT = m.replaceAll(แทนที่);
System.out.println(อินพุต);
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
แมวร้องเหมียว แมวทุกตัวก็ร้องเหมียว
คลาส Matcher ยังมีวิธีการ appendReplacement และ appendTail สำหรับการแทนที่ข้อความ:
ดูตัวอย่างต่อไปนี้เพื่ออธิบายฟังก์ชันการทำงานนี้:
นำเข้า java.util.regex.Matcher;
นำเข้า java.util.regex.Pattern;
RegexMatches คลาสสาธารณะ
-
สตริงคงที่ส่วนตัว REGEX = "a*b";
อินพุตสตริงคงที่ส่วนตัว = "aabfooaabfooabfoob";
แทนที่สตริงคงที่ส่วนตัว = "-";
โมฆะคงที่สาธารณะ main (String [] args) {
รูปแบบ p = Pattern.compile (REGEX);
// รับวัตถุที่จับคู่ Matcher m = p.matcher(INPUT);
StringBuffer sb = StringBuffer ใหม่ ();
ในขณะที่(m.find()){
m.appendReplacement (sb แทนที่);
-
m.ผนวกTail(sb);
System.out.println(sb.toString());
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
-ฟู-ฟู-ฟู-
PatternSyntaxException เป็นคลาสข้อยกเว้นที่ไม่ได้บังคับซึ่งบ่งชี้ข้อผิดพลาดทางไวยากรณ์ในรูปแบบนิพจน์ทั่วไป
คลาส PatternSyntaxException มีวิธีการต่อไปนี้เพื่อช่วยเราดูว่าเกิดข้อผิดพลาดอะไร
หมายเลขซีเรียล | วิธีการและคำแนะนำ |
---|---|
1 | สตริงสาธารณะ getDescription() รับคำอธิบายข้อผิดพลาด |
2 | public int getIndex() ได้รับดัชนีที่ไม่ถูกต้อง |
3 | public String getPattern() ได้รับรูปแบบนิพจน์ทั่วไปที่ไม่ถูกต้อง |
4 | public String getMessage() ส่งคืนสตริงหลายบรรทัดที่มีคำอธิบายข้อผิดพลาดทางไวยากรณ์และดัชนี รูปแบบนิพจน์ทั่วไปของข้อผิดพลาด และการแสดงดัชนีของข้อผิดพลาดในรูปแบบที่มองเห็นได้ |