16/08/2018, 11:01

Sử dụng Regex trong Java – Java Regex

Lớp Object trong java Java Regex hoặc Regular Expression là một API để xác định một mô hình để tìm kiếm hoặc thao tác với chuỗi. Nó được sử dụng rộng rãi để xác định ràng buộc trên các chuỗi như mật khẩu và xác thực email. Java Regex API cung cấp 1 interface và 3 lớp trong gói ...

Lớp Object trong java

Java Regex hoặc Regular Expression là một API để xác định một mô hình để tìm kiếm hoặc thao tác với chuỗi. Nó được sử dụng rộng rãi để xác định ràng buộc trên các chuỗi như mật khẩu và xác thực email.

Java Regex API cung cấp 1 interface và 3 lớp trong gói java.util.regex.

Gói java.util.regex

Lớp Matcher và Pattern trong java cung cấp cơ sở của biểu thức chính quy. Gói java.util.regex cung cấp các lớp và giao diện sau cho các biểu thức chính quy.

  1. Interface MatchResult
  2. Lớp Matcher
  3. Lớp Pattern
  4. Lớp PatternSyntaxException

Lớp Matcher

Nó implements interface MatchResult, cung cấp bộ máy xử lý biểu thức chính quy để thao tác với chuỗi ký tự.

No.Phương thứcMô tả
1boolean matches()kiểm tra xem biểu thức chính quy có khớp với mẫu hay không.
2boolean find()tìm biểu thức tiếp theo khớp với mẫu.
3boolean find(int start)tìm biểu thức tiếp theo khớp với mẫu từ số bắt đầu đã cho.
4String group()trả về chuỗi con phù hợp.
5int start()trả về vị trí bắt đầu của chuỗi con phù hợp.
6int end()trả về vị trí kết thúc của chuỗi con phù hợp.
7int groupCount()trả về tổng số các chuỗi con phù hợp.

Lớp Pattern

Đây là phiên bản được biên dịch của một biểu thức chính quy. Nó được sử dụng để xác định một mẫu cho bộ máy regex.

No.Phương thứcMô tả
1static Pattern compile(String regex)biên dịch regex đã cho và trả về thể hiện của Pattern.
2Matcher matcher(CharSequence input)tạo một matcher khớp với đầu vào đã cho với mẫu.
3static boolean matches(String regex, CharSequence input)Nó biên dịch biểu thức chính quy và tìm kiếm các chuỗi con từ chuỗi input phù hợp với mẫu regex.
4String[] split(CharSequence input)chia chuỗi input đã cho thành mảng các kết quả trùng khớp với mẫu đã cho.
5String pattern()trả về mẫu regex.

Ví dụ sử dụng Regex trong Java

Ví dụ sau tìm tất cả các chuỗi ngày tháng có định dạng dd-mm-yyyy hoặc dd/mm/yyyy trong chuỗi văn bản text1 và xác minh xem chuỗi text2 và text3 có định dạng ngày tháng hay không.

package vn.viettuts;

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

public class RegexExample1 {
    public static void main(String[] args) {
        String text1 = "Hello java regex 10-12-2018, hello world 12/12/2018";
        Pattern pattern = Pattern.compile("d{2}[-|/]d{2}[-|/]d{4}");
        Matcher matcher = pattern.matcher(text1);
        
        System.out.println("Ngày tháng trong chuỗi text1: " + text1);
        while (matcher.find()) {
            System.out.println(text1.substring(matcher.start(), matcher.end()));
        }
        
        String text2 = "12/12/2018";
        String text3 = "12/12/aaaa";
        pattern = Pattern.compile("^d{2}[-|/]d{2}[-|/]d{4}$");
        System.out.println("
Chuỗi " + text2 + " có định dạng ngày tháng: "
                + pattern.matcher(text2).matches());
        
        System.out.println("Chuỗi " + text3 + " có định dạng ngày tháng: "
                + pattern.matcher(text3).matches());
    }
}

Kết quả:

Ngày tháng trong chuỗi text1: Hello java regex 10-12-2018, hello world 12/12/2018
10-12-2018
12/12/2018

Chuỗi 12/12/2018 có định dạng ngày tháng: true
Chuỗi 12/12/aaaa có định dạng ngày tháng: false

Cú pháp của biểu thức chính quy sẽ được giải thích bên dưới.

Cú pháp Regex trong Java

Với các cú pháp và ví dụ sau bạn có thể kiểm tra kết quả bằng các sử dụng trang web https://regex101.com/

Các lớp ký tự Regex

RegexMô tả
[…]trả về một ký tự phù hợp
[abc]a, b, hoặc c
[^abc]Bất kỳ ký tự nào ngoại trừ a, b, hoặc c
[a-zA-Z]a tới z hoặc A tới Z
[a-d[m-p]]a tới d, hoặc m tới p: [a-dm-p]
[a-z&&[def]]d, e, hoặc f
[a-z&&[^bc]]a tới z, ngoại trừ b và c: [ad-z]
[a-z&&[^m-p]]a tới z, ngoại trừ m tới p: [a-lq-z]
[0-9]0 tới 9

Ví dụ:

package vn.viettuts.webclient;

import java.util.regex.Pattern;

public class RegexExample2 {
    public static void main(String args[]) {
        System.out.println(Pattern.matches("[abc]", "a"));
        System.out.println(Pattern.matches("[abc]", "b"));
        System.out.println(Pattern.matches("[abc]", "c"));
        System.out.println(Pattern.matches("[abc]", "abc"));
        System.out.println(Pattern.matches("[abc]", "abcd"));
    }
}

Kết quả:

true
true
true
false
false

Số lượng trong Regex

Số lượng trong Regex chỉ định số lượng xảy ra của một ký tự.

RegexMô tả
X?X xảy ra một hoặc không lần
X+X xảy ra một hoặc nhiều lần
X*X xảy ra không hoặc nhiều lần
X{n}X chỉ xảy ra n lần
X{n,}X xảy ra n hoặc nhiều lần
X{y,z}X xảy ra ít nhất y lần nhưng nhỏ hơn z lần

Ký tự đặc biệt trong Regex

Sau đây là một số ký tự đặc biệt trong Regex

RegexMô tả
.Bất kỳ ký tự nào
^Có 2 cách sử dụng.
1. Đánh dấu bắt đầu của một dòng, một chuỗi.
2. Nếuu sử dụng trong dấu […] thì nó có nghĩa là phủ định.
$Đánh dấu Kết thúc của một dòng
dBất kỳ chữ số nào, viết tắt của [0-9]
DBất kỳ ký tự nào không phải chữ số, viết tắt của [^0-9]
sBất kỳ ký tự trống nào (như dấu cách, tab, xuống dòng, …), viết tắt của [ x0Bf ]
SBất kỳ ký tự trống nào không phải ký tự trống, viết tắt của [^s]
wBất kỳ ký tự chữ nào (chữ cái và chữ số), viết tắt của [a-zA-Z_0-9]
WBất kỳ ký tự nào không phải chữ cái và chữ số, viết tắt của [^w]
Ranh giới của một từ
BKhông phải ranh giới của một từ
Lớp Object trong java
0