Java: Các phương thức của lớp Matcher

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Bài viết này trình bày một số phương thức hữu dụng của lớp Matcher. Để tiện theo dõi, các phương thức sẽ được nhóm theo theo chức năng.

Các phương thức chỉ mục

Các phương thức chỉ mục cung cấp những giá trị chỉ mục hữu ích để cung cấp chính xác vị trị so khớp đã tìm thấy trong chuỗi đầu vào:

  • public int start(): Trả về chỉ mục bắt đầu của so khớp trước đó.
  • public int start(int group): Trả về chỉ mục bắt đầu của dãy con được nhóm đã cho thu thập trong thao tác đối sánh trước đó.
  • public int end(): Trả về độ đoạn sau ký tự cuối cùng được khớp.
  • public int end(int group): Trả về đoạn sau ký tự cuối cùng của dãy con được nhóm thu thập trong thao tác đối sánh trước đó.

Các phương thức study

Các phương thức study sẽ xem xét chuỗi đầu vào và trả về một boolean cho biết mẫu có được tìm thấy hay không.

  • public boolean lookingAt(): Cố gắng khớp chuỗi đầu vào, bắt đầu từ đầu vùng, so với mẫu.
  • public boolean find(): Cố gắng tìm dãy con tiếp theo của dãy đầu vào khớp với mẫu.
  • public boolean find(int start): Đặt lại trình so khớp này và sau đó cố gắng tìm dãy con tiếp theo của chuỗi đầu vào khớp với mẫu, bắt đầu từ chỉ mục được chỉ định.
  • public boolean matches(): Cố gắng so khớp toàn bộ vùng với mẫu.

Các phương thức thay thế

Các phương thức thay thế dùng để thay thế văn bản trong chuỗi đầu vào.

  • public Matcher appendReplacement(StringBuffer sb, String replacement): Thực hiện bước nối và thay thế không phải đầu cuối.
  • public StringBuffer appendTail(StringBuffer sb): Thực hiện bước nối và thay thế đầu cuối.
  • public String replaceAll(String replacement): Thay thế mọi chuỗi con của chuỗi đầu vào phù hợp với mẫu bằng chuỗi thay thế đã cho.
  • public String replaceFirst(String replacement): Thay thế chuỗi con đầu tiên của chuỗi đầu vào phù hợp với mẫu bằng chuỗi thay thế đã cho.
  • public static String quoteReplacement(String s): Trả về một chuỗi thay thế theo nghĩa đen cho chuỗi được chỉ định. Phương thức này tạo ra một chuỗi sẽ hoạt động như một sự thay thế theo nghĩa đen trong phương thức appendReplacement() ở trên. Chuỗi được tạo ra sẽ khớp với chuỗi ký tự trong s được coi là chuỗi các chữ. Dấu gạch chéo ('\') và dấu đô la ('$') sẽ không có ý nghĩa đặc biệt.

Các phương thức start() và end()

Dưới đây là ví dụ biểu diễn việc đếm số lần chuỗi "dog" xuất hiện trong chuỗi đầu vào.

package solutions;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatcherDemo {

  private static final String REGEX = "\\bdog\\b";
  private static final String INPUT = "dog dog dog doggie dogg";

  public static void main(String[] args) {
    Pattern p = Pattern.compile(REGEX);
    //  to mt đi tượng matcher
    Matcher m = p.matcher(INPUT);
    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());
    }
  }
}

Kết quả:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11

Ví dụ trên sử dụng các ranh giới từ để đảm bảo rằng các chữ cái "d" "o" "g" không chỉ là một chuỗi con trong một từ dài hơn. Nó cũng cung cấp một số thông tin hữu ích về vị trí trong chuỗi đầu vào mà đối sánh đã xảy ra. Phương thức start trả về chỉ mục bắt đầu của dãy con được nhóm đã cho nắm bắt trong quá trình khớp trước đó và end trả về chỉ mục của ký tự cuối cùng được so khớp cộng thêm với 1.

Các phương thức matches() và lookingAt()

Cả hai phương thức matches và lookAt đều cố gắng so khớp chuỗi đầu vào với một mẫu. Tuy nhiên, sự khác biệt là matches yêu cầu toàn bộ chuỗi đầu vào phải được khớp, trong khi lookAt thì không. Cả hai phương thức luôn bắt đầu ở đầu chuỗi đầu vào.

Dưới đây là ví dụ áp dụng hai phương thức matches và lookAt:

package solutions;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatchesLooking {

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

    // Khi to
    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());
  }
}

Kết quả:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

Các phương thức replaceFirst(String) và replaceAll(String)

Các phương thức replaceFirst và replaceAll thay thế văn bản tương thích với biểu thức chính quy đã cho. replaceFirst thay thế cho lần tìm thấy đầu tiên và replaceAll thay thế cho tất cả các lần tìm thấy. Dưới đây là ví dụ:

package solutions;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReplaceDemo {

  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);
    // Ly mt đi tượng matcher
    Matcher m = p.matcher(INPUT);
    INPUT = m.replaceAll(REPLACE);
    System.out.println(INPUT);
  }
}

Kết quả:

The cat says meow. All cats say meow

In this first version, all occurrences of dog are replaced with cat. But why stop here? Rather than replace a simple literal like dog, you can replace text that matches any regular expression. The API for this method states that "given the regular expression a*b, the input aabfooaabfooabfoob, and the replacement string -, an invocation of this method on a matcher for that expression would yield the string -foo-foo-foo-."

Trong ví dụ trên, tất cả các lần xuất hiện của dog đều được thay thế bằng cat. Nhưng tại sao lại dừng ở đây? Thay vì thay thế một chữ đơn giản như dog, bạn có thể thay thế văn bản phù hợp với bất kỳ biểu thức chính quy nào. Ví dụ như ta có biểu thức chính quy a*b, chuỗi đầu vào là aabfooaabfooabfoob và chuỗi thay thế là -, thì phương thức replaceAll sẽ cho kết quả là chuỗi -foo-foo-foo-."

Dưới đây là đoạn code demo cụ thể:

package solutions;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReplaceDemo2 {

  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);
    // ly đi tượng matcher
    Matcher m = p.matcher(INPUT);
    INPUT = m.replaceAll(REPLACE);
    System.out.println(INPUT);
  }
}

Kết quả:

-foo-foo-foo-

Để thay thế cho lần tìm thấy đầu tiên thì ta sử dụng phương thức replaceFirst thay cho replaceAll.

Các phương thức appendReplacement(StringBuffer,String) và appendTail(StringBuffer)

Lớp Matcher cũng cung cấp các phương thức appendReplacement và appendTail cho việc thay thế văn bản.

Ví dụ sau đây sử dụng hai phương thức này và hiệu quả cũng tương tự như phương thức replaceAll.

package solutions;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexDemo {

  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);
    Matcher m = p.matcher(INPUT); // ly đi tượng matcher
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
      m.appendReplacement(sb, REPLACE);
    }
    m.appendTail(sb);
    System.out.println(sb.toString());
  }
}

Kết quả:

-foo-foo-foo- 

Tương đương phương thức Matcher trong java.lang.String

Để thuận tiện, lớp String cũng bắt chước một số phương thức Matcher:

  • public String replaceFirst(String regex, String replacement): Thay thế chuỗi con đầu tiên của chuỗi này khớp với biểu thức chính quy đã cho với chuỗi thay thế đã cho. Ví dụ như str.replaceFirst(regexrepl) cho kết quả tương tự như biểu thức Pattern.compile(regex).matcher(str).replaceFirst(repl).
  • public String replaceAll(String regex, String replacement): Thay thế từng chuỗi con của chuỗi này khớp với biểu thức chính quy đã cho với thay thế đã cho. Ví dụ như str.replaceAll(regexrepl) cho kết quả tương đương với Pattern.compile(regex).matcher(str).replaceAll(repl).
» Tiếp: Các phương thức của lớp PatternSyntaxException
« Trước: Các phương thức của lớp Pattern
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!