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()

ส่งคืนสตริงหลายบรรทัดที่มีคำอธิบายข้อผิดพลาดทางไวยากรณ์และดัชนีรูปแบบนิพจน์ทั่วไปที่ผิดพลาดและการแสดงดัชนีข้อผิดพลาดภายในรูปแบบ