Java - นิพจน์ทั่วไป
Java จัดเตรียมแพ็กเกจ java.util.regex สำหรับการจับคู่รูปแบบกับนิพจน์ทั่วไป นิพจน์ทั่วไปของ Java นั้นคล้ายกับภาษาโปรแกรม Perl มากและเรียนรู้ได้ง่ายมาก
นิพจน์ทั่วไปคือลำดับพิเศษของอักขระที่ช่วยให้คุณจับคู่หรือค้นหาสตริงหรือชุดของสตริงอื่น ๆ โดยใช้ไวยากรณ์เฉพาะที่จัดขึ้นในรูปแบบ สามารถใช้เพื่อค้นหาแก้ไขหรือจัดการข้อความและข้อมูล
แพ็คเกจ java.util.regex ส่วนใหญ่ประกอบด้วยสามคลาสต่อไปนี้ -
Pattern Class- วัตถุ Pattern คือการแสดงนิพจน์ทั่วไปที่รวบรวม คลาส Pattern ไม่มีตัวสร้างสาธารณะ ในการสร้างรูปแบบคุณต้องเรียกใช้หนึ่งในแบบคงที่สาธารณะก่อนcompile()วิธีการซึ่งจะส่งคืนวัตถุ Pattern วิธีการเหล่านี้ยอมรับนิพจน์ทั่วไปเป็นอาร์กิวเมนต์แรก
Matcher Class- วัตถุ Matcher เป็นเครื่องมือที่ตีความรูปแบบและดำเนินการจับคู่กับสตริงอินพุต เช่นเดียวกับคลาส Pattern Matcher ไม่ได้กำหนดตัวสร้างสาธารณะ คุณได้รับวัตถุ Matcher โดยเรียกใช้ไฟล์matcher() วิธีการบนวัตถุ Pattern
PatternSyntaxException - ออบเจ็กต์ PatternSyntaxException เป็นข้อยกเว้นที่ไม่ได้เลือกไว้ซึ่งบ่งชี้ข้อผิดพลาดทางไวยากรณ์ในรูปแบบนิพจน์ทั่วไป
การจับภาพกลุ่ม
การจับกลุ่มเป็นวิธีการปฏิบัติต่ออักขระหลายตัวเป็นหน่วยเดียว สร้างขึ้นโดยการวางอักขระที่จะจัดกลุ่มภายในชุดวงเล็บ ตัวอย่างเช่นนิพจน์ทั่วไป (สุนัข) สร้างกลุ่มเดียวที่มีตัวอักษร "d" "o" และ "g"
การจับภาพกลุ่มจะมีหมายเลขโดยการนับวงเล็บเปิดจากด้านซ้ายไปทางขวา ในนิพจน์ ((A) (B (C))) ตัวอย่างเช่นมีสี่กลุ่มดังกล่าว -
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
หากต้องการทราบจำนวนกลุ่มที่มีอยู่ในนิพจน์ให้เรียกใช้เมธอด groupCount บนอ็อบเจ็กต์ตัวจับคู่ เมธอด groupCount ส่งคืนไฟล์int แสดงจำนวนกลุ่มการจับภาพที่มีอยู่ในรูปแบบของตัวจับคู่
นอกจากนี้ยังมีกลุ่มพิเศษกลุ่ม 0 ซึ่งแสดงถึงนิพจน์ทั้งหมดเสมอ กลุ่มนี้ไม่รวมอยู่ในจำนวนทั้งหมดที่รายงานโดย groupCount
Example
ตัวอย่างต่อไปนี้แสดงวิธีการค้นหาสตริงหลักจากสตริงตัวอักษรและตัวเลขที่กำหนด -
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
}else {
System.out.println("NO MATCH");
}
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Output
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
ไวยากรณ์นิพจน์ทั่วไป
นี่คือตารางที่แสดงรายการไวยากรณ์ของนิพจน์ทั่วไป metacharacter ทั้งหมดที่มีอยู่ใน Java -
Subexpression | ตรงกัน |
---|---|
^ | ตรงกับจุดเริ่มต้นของบรรทัด |
$ | ตรงกับจุดสิ้นสุดของบรรทัด |
. | จับคู่อักขระเดี่ยวใด ๆ ยกเว้นขึ้นบรรทัดใหม่ การใช้m ตัวเลือกช่วยให้สามารถจับคู่ขึ้นบรรทัดใหม่ได้เช่นกัน |
[... ] | จับคู่อักขระเดี่ยวใด ๆ ในวงเล็บ |
[^ ... ] | จับคู่อักขระเดี่ยวใด ๆ ที่ไม่อยู่ในวงเล็บ |
\ ก | จุดเริ่มต้นของสตริงทั้งหมด |
\ z | สิ้นสุดสตริงทั้งหมด |
\ Z | สิ้นสุดสตริงทั้งหมดยกเว้นตัวยุติบรรทัดสุดท้ายที่อนุญาต |
re * | จับคู่ 0 หรือมากกว่าที่เกิดขึ้นของนิพจน์ก่อนหน้า |
re + | ตรงกับสิ่งก่อนหน้าอย่างน้อย 1 อย่าง |
รี? | จับคู่ 0 หรือ 1 ครั้งของนิพจน์ก่อนหน้า |
อีกครั้ง {n} | ตรงกับจำนวนครั้งที่เกิดขึ้นของนิพจน์ก่อนหน้า |
อีก {n,} | จับคู่ n เหตุการณ์ขึ้นไปของนิพจน์ก่อนหน้า |
ใหม่ {n, m} | จับคู่อย่างน้อย n และมากที่สุด m ที่เกิดขึ้นของนิพจน์ก่อนหน้า |
ก | ข | จับคู่ a หรือ b |
(อีกครั้ง) | จัดกลุ่มนิพจน์ทั่วไปและจดจำข้อความที่ตรงกัน |
(?: อีกครั้ง) | จัดกลุ่มนิพจน์ทั่วไปโดยไม่จำข้อความที่ตรงกัน |
(?> อีกครั้ง) | จับคู่รูปแบบอิสระโดยไม่ต้องย้อนรอย |
\ w | จับคู่อักขระคำ |
\ ว | จับคู่อักขระที่ไม่ใช่คำหลัก |
\ s | ตรงกับช่องว่าง เทียบเท่ากับ [\ t \ n \ r \ f] |
\ S | ตรงกับ nonwhitespace |
\ d | ตรงกับตัวเลข เทียบเท่ากับ [0-9] |
\ D | ตรงกับ nondigits |
\ ก | ตรงกับจุดเริ่มต้นของสตริง |
\ Z | ตรงกับจุดสิ้นสุดของสตริง หากมีขึ้นบรรทัดใหม่จะตรงกับก่อนขึ้นบรรทัดใหม่ |
\ z | ตรงกับจุดสิ้นสุดของสตริง |
\ G | ตรงกับจุดที่นัดสุดท้ายจบ |
\ n | อ้างอิงกลับเพื่อจับหมายเลขกลุ่ม "n" |
\ b | จับคู่ขอบเขตของคำเมื่ออยู่นอกวงเล็บ จับคู่ backspace (0x08) เมื่ออยู่ในวงเล็บ |
\ B | ตรงกับขอบเขตที่ไม่ใช่คำ |
\ n, t ฯลฯ | จับคู่การขึ้นบรรทัดใหม่การคืนค่าขนส่งแท็บ ฯลฯ |
\ Q | Escape (quote) อักขระทั้งหมดไม่เกิน \ E |
\ E | เริ่มต้นการอ้างอิงด้วย \ Q |
วิธีการของคลาส Matcher
นี่คือรายการวิธีการอินสแตนซ์ที่มีประโยชน์ -
วิธีการจัดทำดัชนี
วิธีการจัดทำดัชนีให้ค่าดัชนีที่เป็นประโยชน์ซึ่งแสดงตำแหน่งที่ตรงกันในสตริงอินพุต -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public int start() ส่งคืนดัชนีเริ่มต้นของการแข่งขันก่อนหน้า |
2 | public int start(int group) ส่งคืนดัชนีเริ่มต้นของลำดับต่อมาที่จับโดยกลุ่มที่ระบุระหว่างการดำเนินการจับคู่ก่อนหน้า |
3 | public int end() ส่งคืนค่าชดเชยหลังจากอักขระสุดท้ายที่ตรงกัน |
4 | public int end(int group) ส่งคืนค่าชดเชยหลังจากอักขระสุดท้ายของลำดับต่อมาที่จับโดยกลุ่มที่ระบุระหว่างการดำเนินการจับคู่ก่อนหน้า |
วิธีการศึกษา
วิธีการศึกษาตรวจสอบสตริงอินพุตและส่งคืนบูลีนที่ระบุว่าพบรูปแบบหรือไม่ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public boolean lookingAt() พยายามจับคู่ลำดับการป้อนข้อมูลโดยเริ่มต้นที่จุดเริ่มต้นของภูมิภาคกับรูปแบบ |
2 | public boolean find() พยายามค้นหาลำดับต่อไปของลำดับอินพุตที่ตรงกับรูปแบบ |
3 | public boolean find(int start) รีเซ็ตตัวจับคู่นี้จากนั้นพยายามค้นหาลำดับถัดไปของลำดับอินพุตที่ตรงกับรูปแบบโดยเริ่มจากดัชนีที่ระบุ |
4 | public boolean matches() พยายามจับคู่ภูมิภาคทั้งหมดกับรูปแบบ |
วิธีการเปลี่ยน
วิธีการแทนที่เป็นวิธีที่มีประโยชน์ในการแทนที่ข้อความในสตริงอินพุต -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) ใช้ขั้นตอนการผนวกและแทนที่ที่ไม่ใช่เทอร์มินัล |
2 | public StringBuffer appendTail(StringBuffer sb) ใช้ขั้นตอนต่อท้ายและแทนที่เทอร์มินัล |
3 | public String replaceAll(String replacement) แทนที่ลำดับการป้อนข้อมูลในลำดับต่อ ๆ มาที่ตรงกับรูปแบบด้วยสตริงการแทนที่ที่กำหนด |
4 | public String replaceFirst(String replacement) แทนที่ลำดับการป้อนข้อมูลลำดับแรกที่ตรงกับรูปแบบด้วยสตริงการแทนที่ที่กำหนด |
5 | public static String quoteReplacement(String s) ส่งคืนสตริงการแทนที่ตามตัวอักษรสำหรับสตริงที่ระบุ วิธีนี้สร้างสตริงที่จะใช้แทนตัวอักษรs ในเมธอด appendReplacement ของคลาส Matcher |
วิธีการเริ่มต้นและสิ้นสุด
ต่อไปนี้เป็นตัวอย่างที่นับจำนวนครั้งที่คำว่า "cat" ปรากฏในสตริงอินพุต -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "\\bcat\\b";
private static final String INPUT = "cat cat cat cattie cat";
public static void main( String args[] ) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Output
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
คุณจะเห็นได้ว่าตัวอย่างนี้ใช้ขอบเขตของคำเพื่อให้แน่ใจว่าตัวอักษร "c" "a" "t" ไม่ใช่เพียงแค่สตริงย่อยในคำที่ยาวกว่า นอกจากนี้ยังให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับตำแหน่งของสตริงอินพุตที่ตรงกัน
วิธีการเริ่มต้นจะส่งคืนดัชนีเริ่มต้นของลำดับต่อมาที่จับโดยกลุ่มที่ระบุในระหว่างการดำเนินการจับคู่ก่อนหน้านี้และจุดสิ้นสุดจะส่งกลับดัชนีของอักขระสุดท้ายที่ตรงกันบวกหนึ่ง
การจับคู่และการมองหาที่วิธีการ
การจับคู่และวิธีการ lookingAt ทั้งสองพยายามจับคู่ลำดับการป้อนข้อมูลกับรูปแบบ อย่างไรก็ตามความแตกต่างก็คือการจับคู่ต้องใช้ลำดับการป้อนข้อมูลทั้งหมดในการจับคู่ในขณะที่กำลังมองหา
ทั้งสองวิธีเริ่มต้นที่จุดเริ่มต้นของสตริงอินพุตเสมอ นี่คือตัวอย่างที่อธิบายฟังก์ชันการทำงาน -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
private static Pattern pattern;
private static Matcher matcher;
public static void main( String args[] ) {
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("Current REGEX is: "+REGEX);
System.out.println("Current INPUT is: "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Output
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
replaceFirst และ replaceAll Methods
วิธีการ replaceFirst และ replaceAll จะแทนที่ข้อความที่ตรงกับนิพจน์ทั่วไปที่กำหนด ตามที่ระบุชื่อไว้ replaceFirst จะแทนที่เหตุการณ์แรกและ replaceAll จะแทนที่เหตุการณ์ทั้งหมด
นี่คือตัวอย่างที่อธิบายฟังก์ชันการทำงาน -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "dog";
private static String INPUT = "The dog says meow. " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Output
The cat says meow. All cats say meow.
วิธี appendReplacement และ appendTail
คลาส Matcher ยังมีวิธี appendReplacement และ appendTail สำหรับการแทนที่ข้อความ
นี่คือตัวอย่างที่อธิบายฟังก์ชันการทำงาน -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Output
-foo-foo-foo-
วิธีการเรียน PatternSyntaxException
PatternSyntaxException เป็นข้อยกเว้นที่ไม่ได้เลือกไว้ซึ่งบ่งชี้ข้อผิดพลาดทางไวยากรณ์ในรูปแบบนิพจน์ทั่วไป คลาส PatternSyntaxException มีวิธีการต่อไปนี้เพื่อช่วยให้คุณระบุสิ่งที่ผิดพลาด -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public String getDescription() ดึงคำอธิบายของข้อผิดพลาด |
2 | public int getIndex() ดึงดัชนีข้อผิดพลาด |
3 | public String getPattern() ดึงรูปแบบนิพจน์ทั่วไปที่ผิดพลาด |
4 | public String getMessage() ส่งคืนสตริงหลายบรรทัดที่มีคำอธิบายข้อผิดพลาดทางไวยากรณ์และดัชนีรูปแบบนิพจน์ทั่วไปที่ผิดพลาดและการแสดงดัชนีข้อผิดพลาดภายในรูปแบบ |