Java Regex - Hướng dẫn nhanh
Java cung cấp gói java.util.regex để đối sánh mẫu với biểu thức chính quy. Các biểu thức chính quy của Java rất giống với ngôn ngữ lập trình Perl và rất dễ học.
Biểu thức chính quy là một chuỗi ký tự đặc biệt giúp bạn khớp hoặc tìm các chuỗi hoặc tập hợp chuỗi khác, sử dụng cú pháp chuyên biệt được tổ chức trong một mẫu. Chúng có thể được sử dụng để tìm kiếm, chỉnh sửa hoặc thao tác với văn bản và dữ liệu.
Gói java.util.regex chủ yếu bao gồm ba lớp sau:
Pattern Class- Một đối tượng Pattern là một đại diện đã biên dịch của một biểu thức chính quy. Lớp Pattern không cung cấp hàm tạo công khai. Để tạo một mẫu, trước tiên bạn phải gọi một trong các lệnh tĩnh công khai của nócompile()các phương thức này sẽ trả về một đối tượng Pattern. Các phương thức này chấp nhận một biểu thức chính quy làm đối số đầu tiên.
Matcher Class- Một đối tượng Matcher là công cụ thông dịch mẫu và thực hiện các thao tác so khớp với một chuỗi đầu vào. Giống như lớp Pattern, Matcher định nghĩa không có hàm tạo công khai. Bạn có được một đối tượng Matcher bằng cách gọimatcher() trên một đối tượng Pattern.
PatternSyntaxException - Đối tượng PatternSyntaxException là một ngoại lệ không được kiểm tra chỉ ra lỗi cú pháp trong một mẫu biểu thức chính quy.
Chụp nhóm là một cách để coi nhiều ký tự như một đơn vị duy nhất. Chúng được tạo ra bằng cách đặt các ký tự được nhóm bên trong một tập hợp các dấu ngoặc đơn. Ví dụ: biểu thức chính quy (dog) tạo một nhóm duy nhất chứa các chữ cái "d", "o" và "g".
Các nhóm bắt được đánh số bằng cách đếm các dấu ngoặc đơn mở đầu của chúng từ trái sang phải. Ví dụ: trong biểu thức ((A) (B (C))), có bốn nhóm như vậy -
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
Để biết có bao nhiêu nhóm hiện diện trong biểu thức, hãy gọi phương thức groupCount trên đối tượng so khớp. Phương thức groupCount trả về mộtint hiển thị số lượng nhóm bắt có trong mẫu của trình đối sánh.
Ngoài ra còn có một nhóm đặc biệt, nhóm 0, luôn đại diện cho toàn bộ biểu thức. Nhóm này không được bao gồm trong tổng số được báo cáo bởi groupCount.
Thí dụ
Ví dụ sau minh họa cách tìm một chuỗi chữ số từ chuỗi chữ và số đã cho:
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");
}
}
}
Điều này sẽ tạo ra kết quả sau:
Đầu ra
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Giới thiệu
Các java.util.regex.MatchResultgiao diện đại diện cho kết quả của một hoạt động khớp. Giao diện này chứa các phương thức truy vấn được sử dụng để xác định kết quả so khớp với một biểu thức chính quy. Các ranh giới đối sánh, nhóm và ranh giới nhóm có thể được nhìn thấy nhưng không được sửa đổi thông qua Kết quả đối sánh.
Khai báo giao diện
Sau đây là khai báo cho java.util.regex.MatchResult giao diện -
public interface MatchResult
Phương thức giao diện
Sr.No | Phương pháp & Mô tả |
---|---|
1 | int end () Trả về độ lệch sau khi ký tự cuối cùng được khớp. |
2 | int end (int group) Trả về phần bù sau ký tự cuối cùng của dãy con được nhóm nhất định bắt trong trận đấu này. |
3 | Nhóm chuỗi () Trả về dãy con đầu vào được so khớp với trận trước. |
4 | Nhóm chuỗi (nhóm int) Trả về dãy con đầu vào được nhóm đã cho bắt trong quá trình khớp trước đó. |
5 | int groupCount () Trả về số lượng nhóm chụp trong mẫu của kết quả đối sánh này. |
6 | int start () Trả về chỉ số bắt đầu của trận đấu. |
7 | 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 trận đấu này. |
Giới thiệu
Các java.util.regex.Pattern lớp đại diện cho một biểu diễn đã biên dịch của một biểu thức chính quy.
Khai báo lớp
Sau đây là khai báo cho java.util.regex.Pattern lớp học -
public final class Pattern
extends Object
implements Serializable
Cánh đồng
Sau đây là các trường cho java.util.regex.Duration lớp học -
static int CANON_EQ - Cho phép tính tương đương chuẩn.
static int CASE_INSENSITIVE - Cho phép đối sánh không phân biệt chữ hoa chữ thường.
static int COMMENTS - Cho phép khoảng trắng và nhận xét theo mẫu.
static int DOTALL - Bật chế độ dotall.
static int LITERAL - Cho phép phân tích cú pháp theo nghĩa đen của mẫu.
static int MULTILINE - Cho phép chế độ đa dòng.
static int UNICODE_CASE - Cho phép gấp chữ viết hoa nhận biết Unicode.
static int UNICODE_CHARACTER_CLASS - Cho phép phiên bản Unicode của các lớp ký tự Định sẵn và các lớp ký tự POSIX.
static int UNIX_LINES - Bật chế độ dòng Unix.
Phương thức lớp
Sr.No | Phương pháp & Mô tả |
---|---|
1 | Biên dịch mẫu tĩnh (Chuỗi regex) Biên dịch biểu thức chính quy đã cho thành một mẫu. |
2 | Biên dịch mẫu tĩnh (Chuỗi regex, cờ int) Biên dịch biểu thức chính quy đã cho thành một mẫu với các cờ đã cho. |
3 | int flags () Trả về các cờ đối sánh của mẫu này. |
4 | Trình so khớp Matcher (đầu vào CharSequence) Tạo một trình đối sánh sẽ khớp với đầu vào đã cho với mẫu này. |
5 | so khớp boolean tĩnh (chuỗi regex, đầu vào CharSequence) Biên dịch biểu thức chính quy đã cho và cố gắng khớp với đầu vào đã cho với nó. |
6 | Chuỗi mẫu() Trả về biểu thức chính quy mà từ đó mẫu này đã được biên dịch. |
7 | Trích dẫn chuỗi tĩnh (Chuỗi s) Trả về một Chuỗi mẫu chữ cho Chuỗi được chỉ định. |
số 8 | Chuỗi [] tách (đầu vào CharSequence) Tách chuỗi đầu vào đã cho xung quanh các kết quả phù hợp của mẫu này. |
9 | String [] split (đầu vào CharSequence, int giới hạn) Tách chuỗi đầu vào đã cho xung quanh các kết quả phù hợp của mẫu này. |
10 | Chuỗi toString () Trả về biểu diễn chuỗi của mẫu này. |
Các phương thức kế thừa
Lớp này kế thừa các phương thức từ các lớp sau:
- Java.lang.Object
Giới thiệu
Các java.util.regex.Matcher lớp hoạt động như một công cụ thực hiện các phép toán so khớp trên một chuỗi ký tự bằng cách diễn giải một Mẫu.
Khai báo lớp
Sau đây là khai báo cho java.util.regex.Matcher lớp học -
public final class Matcher
extends Object
implements MatchResult
Phương thức lớp
Sr.No | Phương pháp & Mô tả |
---|---|
1 | Matcher appendReplacement (StringBuffer sb, String thay thế) Triển khai bước nối và thay thế không phải đầu cuối. |
2 | StringBuffer appendTail (StringBuffer sb) Thực hiện bước nối và thay thế đầu cuối. |
3 | int end () Trả về độ lệch sau khi ký tự cuối cùng được khớp. |
4 | int end (int group) Trả về phần bù sau ký tự cuối cùng của dãy con được nhóm nhất định bắt trong thao tác khớp trước đó. |
5 | 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. |
6 | 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. |
7 | Nhóm chuỗi () Trả về dãy con đầu vào được nhóm đã cho bắt trong quá trình khớp trước đó. |
số 8 | Nhóm chuỗi (Tên chuỗi) Trả về dãy con đầu vào được nhóm bắt có tên đã cho bắt trong thao tác khớp trước đó. |
9 | int groupCount () Trả về số lượng nhóm bắt trong mẫu của trình so khớp này. |
10 | boolean hasAnchoringBounds () Truy vấn việc neo giữ các giới hạn khu vực cho đối sánh này. |
11 | boolean hasTransparentBounds () Truy vấn tính minh bạch của giới hạn khu vực cho đối sánh này. |
12 | boolean hitEnd () Trả về true nếu phần cuối của dữ liệu đầu vào bị công cụ tìm kiếm đánh vào trong thao tác so khớp cuối cùng do trình so khớp này thực hiện. |
13 | boolean lookAt () Cố gắng khớp chuỗi đầu vào, bắt đầu từ đầu vùng, so với mẫu. |
14 | các trận đấu boolean () Cố gắng so khớp toàn bộ khu vực với mẫu. |
15 | Mẫu hoa văn () Trả về mẫu được diễn giải bởi trình so khớp này. |
16 | static String quoteReplacement (String s) Trả về một Chuỗi thay thế theo nghĩa đen cho Chuỗi được chỉ định. |
17 | Vùng đối sánh (int start, int end) Đặt giới hạn cho khu vực của trình kết hợp này. |
18 | int regionEnd () Báo cáo chỉ mục cuối (độc quyền) của khu vực của đối sánh này. |
19 | int regionStart () Báo cáo chỉ mục bắt đầu của khu vực của đối sánh này. |
20 | String ReplaceAll (Thay thế chuỗi) Thay thế mọi chuỗi con của chuỗi đầu vào khớp với mẫu bằng chuỗi thay thế đã cho. |
21 | String ReplaceFirst (Thay thế chuỗi) 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. |
22 | boolean requestEnd () Trả về true nếu nhiều đầu vào hơn có thể thay đổi một kết quả phù hợp thành một kết quả tiêu cực. |
23 | Đặt lại Matcher () Đặt lại trình kết hợp này. |
24 | Đặt lại Matcher (đầu vào CharSequence) Đặt lại trình so khớp này với một chuỗi đầu vào mới. |
25 | int start () Trả về chỉ số bắt đầu của trận đấu trước đó. |
26 | int start (int group) 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 đó. |
27 | MatchResult toMatchResult () Trả về trạng thái khớp của trình so khớp này dưới dạng MatchResult. |
28 | Chuỗi toString () Trả về biểu diễn chuỗi của trình so khớp này. |
29 | Sử dụng MatcherAnchoringBounds (boolean b) Đặt việc neo các giới hạn khu vực cho đối sánh này. |
30 | Matcher usePattern (Mẫu mớiPattern) Thay đổi Mẫu mà Trình so khớp này sử dụng để tìm các kết quả phù hợp. |
31 | Sử dụng MatcherTransparentBounds (boolean b) Đặt độ trong suốt của giới hạn vùng cho đối sánh này. |
Các phương thức kế thừa
Lớp này kế thừa các phương thức từ các lớp sau:
- Java.lang.Object
Giới thiệu
Các java.util.regex.PatternSyntaxException lớp đại diện cho một ngoại lệ không được kiểm tra được ném ra để chỉ ra lỗi cú pháp trong một mẫu biểu thức chính quy.
Khai báo lớp
Sau đây là khai báo cho java.util.regex.PatternSyntaxException lớp học -
public class PatternSyntaxException
extends IllegalArgumentException
Người xây dựng
Sr.No | Phương pháp & Mô tả |
---|---|
1 | PatternSyntaxException(String desc, String regex, int index) Xây dựng một thể hiện mới của lớp này. |
Phương thức lớp
Sr.No | Phương pháp & Mô tả |
---|---|
1 | String getDescription() Truy xuất mô tả của lỗi. |
2 | int getIndex() Truy xuất chỉ số lỗi. |
3 | String getMessage() Trả về một chuỗi nhiều dòng chứa mô tả về lỗi cú pháp và chỉ mục của nó, mẫu biểu thức chính quy bị lỗi và chỉ báo trực quan về chỉ mục lỗi trong mẫu. |
4 | String getPattern() Truy xuất mẫu biểu thức chính quy bị lỗi. |
Các phương thức kế thừa
Lớp này kế thừa các phương thức từ các lớp sau:
- Java.lang.Throwable
- Java.lang.Object
Thí dụ
Ví dụ sau cho thấy việc sử dụng các phương thức lớp java.util.regex.Pattern.PatternSyntaxException.
package com.tutorialspoint;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class PatternSyntaxExceptionDemo {
private static String REGEX = "[";
private static String INPUT = "The dog says meow " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
try{
Pattern pattern = Pattern.compile(REGEX);
// get a matcher object
Matcher matcher = pattern.matcher(INPUT);
INPUT = matcher.replaceAll(REPLACE);
} catch(PatternSyntaxException e){
System.out.println("PatternSyntaxException: ");
System.out.println("Description: "+ e.getDescription());
System.out.println("Index: "+ e.getIndex());
System.out.println("Message: "+ e.getMessage());
System.out.println("Pattern: "+ e.getPattern());
}
}
}
Hãy để chúng tôi biên dịch và chạy chương trình trên, điều này sẽ tạo ra kết quả sau:
PatternSyntaxException:
Description: Unclosed character class
Index: 0
Message: Unclosed character class near index 0
[
^
Pattern: [
Sau đây là các ví dụ khác nhau về việc so khớp các ký tự bằng cách sử dụng biểu thức chính quy trong java.
Sr.No | Xây dựng & Kết hợp |
---|---|
1 | x Nhân vật x |
2 | \\ Ký tự gạch chéo ngược |
3 | \ 0n Ký tự có giá trị bát phân 0n (0 ≤ n ≤ 7) |
4 | \ 0nn Ký tự có giá trị bát phân 0nn (0 ≤ n ≤ 7) |
5 | \ 0mnn Ký tự có giá trị bát phân 0mnn (0 ≤ m ≤ 3, 0 ≤ n ≤ 7) |
6 | \ xhh Ký tự có giá trị thập lục phân 0xhh |
7 | \ uhhhh Ký tự có giá trị thập lục phân 0xhhhh |
số 8 | \ t Ký tự tab ('\ u0009') |
9 | \ n Ký tự dòng mới (nguồn cấp dữ liệu dòng) ('\ u000A') |
10 | \ r Ký tự xuống dòng ('\ u000D') |
11 | \ f Ký tự nguồn cấp dữ liệu biểu mẫu ('\ u000C') |
Sau đây là các ví dụ khác nhau về việc so khớp các lớp ký tự bằng cách sử dụng biểu thức chính quy trong java.
Sr.No | Xây dựng & Kết hợp |
---|---|
1 | [abc] a, b hoặc c (lớp đơn giản). |
2 | [^ abc] Bất kỳ ký tự nào ngoại trừ a, b hoặc c (phủ định). |
3 | [a-zA-Z] a đến z hoặc A đến Z, bao gồm (phạm vi). |
4 | [ad [mp]] a đến d, hoặc m đến p: [a-dm-p] (union). |
5 | [az && [def]] d, e, hoặc f (giao điểm). |
6 | [az && [^ bc]] a đến z, ngoại trừ b và c: [ad-z] (phép trừ) |
7 | [az && [^ mp]] a đến z, và không phải m qua p: [a-lq-z] (phép trừ). |
Sau đây là các ví dụ khác nhau về việc đối sánh các lớp ký tự được xác định trước bằng cách sử dụng biểu thức chính quy trong java.
Sr.No | Xây dựng & Kết hợp |
---|---|
1 | . Bất kỳ ký tự nào (có thể có hoặc không khớp với các ký tự kết thúc dòng). |
2 | \ d Một chữ số: [0-9]. |
3 | \ D Một không phải chữ số: [^ 0-9]. |
4 | \S Một ký tự khoảng trắng: [\ t \ n \ x0B \ f \ r] |
5 | \S Một ký tự không có khoảng trắng: [^ \ s]. |
6 | \ w Một ký tự từ: [a-zA-Z_0-9]. |
7 | \ W Một ký tự không phải từ: [^ \ w] |
Sau đây là các ví dụ khác nhau về việc đối sánh các lớp ký tự POSIX bằng cách sử dụng biểu thức chính quy trong java.
Sr.No | Xây dựng & Kết hợp |
---|---|
1 | \ p {Thấp hơn} Một ký tự chữ cái viết thường: [az]. |
2 | \ p {Thượng} Một ký tự chữ cái viết hoa: [AZ]. |
3 | \ p {ASCII} Tất cả ASCII: [\ x00- \ x7F]. |
4 | \ p {Alpha} Một ký tự chữ cái: [\ p {Lower} \ p {Upper}]. |
5 | \ p {Digit} Một chữ số thập phân: [0-9]. |
6 | \ p {Alnum} Một ký tự chữ và số: [\ p {Alpha} \ p {Digit}]. |
7 | \ p {Punct} Dấu câu: Một trong số! "# $% & '() * +, -. / :; <=>? @ [\] ^ _> {|} <. |
số 8 | \ p {Đồ thị} Một ký tự hiển thị: [\ p {Alnum} \ p {Punct}]. |
9 | \ p {In} Một ký tự có thể in: [\ p {Graph} \ x20]. |
10 | \ p {Trống} Khoảng trắng hoặc tab: [\ t]. |
11 | \ p {XDigit} Một chữ số thập lục phân: [0-9a-fA-F]. |
12 | \ p {Dấu cách} Một ký tự khoảng trắng: [\ t \ n \ x0B \ f \ r]. |
Sau đây là các ví dụ khác nhau về việc đối sánh các lớp ký tự JAVA bằng cách sử dụng biểu thức chính quy trong java.
Sr.No | Xây dựng & Kết hợp |
---|---|
1 | \ p {javaLowerCase} Tương đương với java.lang.Character.isLowerCase (). |
2 | \ p {javaUpperCase} Tương đương với java.lang.Character.isUpperCase (). |
3 | \ p {javaWhitespace} Equivalent to java.lang.Character.isWhitespace(). |
4 | \p{javaMirrored} Equivalent to java.lang.Character.isMirrored(). |
Following are various examples of matching Unicode character classes using regular expression in java.
Sr.No | Construct & Matches |
---|---|
1 | \p{IsLatin} A Latin script character. |
2 | \p{InGreek} A character in the Greek block. |
3 | \p{Lu} An uppercase letter. |
4 | \p{IsAlphabetic} An alphabetic character (binary property). |
5 | \p{Sc} A currency symbol. |
6 | \P{InGreek} Any character except one in the Greek block. |
7 | [\p{L}&&[^\p{Lu}]] Any letter except an uppercase letter. |
Following are various examples of Boundary Matchers using regular expression in java.
Sr.No | Construct & Matches |
---|---|
1 | ^ The beginning of a line. |
2 | $ The end of a line. |
3 | \b A word boundary. |
4 | \B A non-word boundary. |
5 | \A The beginning of the input. |
6 | \G The end of the previous match. |
7 | \Z The end of the input but for the final terminator, if any. |
8 | \z The end of the input. |
A greedy quantifier indicates to search engine to search the entire string and check whether it matches the given regexp. Following are various examples of Greedy Quantifiers using regular expression in java.
Sr.No | Construct & Matches |
---|---|
1 | X? X, once or not at all. |
2 | X* X, zero or more times |
3 | X+ X, one or more times. |
4 | X{n} X, exactly n times. |
5 | X{n,} X, at least n times. |
6 | X{n,m} X, at least n but not more than m times |
A reluctant quantifier indicates the search engine to start with the shortest possible piece of the string. Once match found, the engine continue; otherwise it adds one character to the section of the string being checked and search that, and so on. This process follows until it finds a match or the entire string has been used up. Following are various examples of Reluctant Quantifiers using regular expression in java.
Sr.No | Construct & Matches |
---|---|
1 | X?? X, once or not at all. |
2 | X*? X, zero or more times |
3 | X+? X, one or more times. |
4 | X{n}? X, exactly n times. |
5 | X{n,}? X, at least n times. |
6 | X{n,m}? X, at least n but not more than m times |
A possessive quantifier is similar to greedy quantifier. It indicates the engine to start by checking the entire string.It is different in the sense if it doesn't work, if match failed and there is no looking back. Following are various examples of Possessive Quantifiers using regular expression in java.
Sr.No | Construct & Matches |
---|---|
1 | X?+ X, once or not at all. |
2 | X*+ X, zero or more times |
3 | X++ X, one or more times. |
4 | X{n}+ X, exactly n times. |
5 | X{n,}+ X, at least n times. |
6 | X{n,m}+ X, at least n but not more than m times |
Following are various examples of Logical Operators using regular expression in java.
Sr.No | Construct & Matches |
---|---|
1 | XY X followed by Y. |
2 | X|Y Either X or Y. |