Java - Biểu thức chính quy
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
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.
Example
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:
Output
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Cú pháp biểu thức chính quy
Đây là bảng liệt kê tất cả các cú pháp siêu ký tự biểu thức chính quy có sẵn trong Java -
Subexpression | Diêm |
---|---|
^ | Khớp với đầu dòng. |
$ | Khớp với cuối dòng. |
. | Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụngm tùy chọn cho phép nó phù hợp với dòng mới. |
[...] | Khớp bất kỳ ký tự đơn nào trong ngoặc. |
[^ ...] | Đối sánh bất kỳ ký tự đơn nào không có trong dấu ngoặc. |
\ A | Bắt đầu của toàn bộ chuỗi. |
\ z | Kết thúc toàn bộ chuỗi. |
\ Z | Kết thúc toàn bộ chuỗi ngoại trừ dấu chấm cuối dòng cuối cùng được phép. |
lại * | Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước. |
lại + | Khớp với 1 hoặc nhiều điều trước đó. |
lại? | Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước. |
lại {n} | Khớp chính xác n số lần xuất hiện của biểu thức trước. |
lại {n,} | So khớp n hoặc nhiều lần xuất hiện của biểu thức trước. |
lại {n, m} | Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước. |
a | b | Đối sánh với a hoặc b. |
(lại) | Nhóm các biểu thức chính quy và ghi nhớ văn bản phù hợp. |
(?: lại) | Nhóm các biểu thức chính quy mà không cần nhớ văn bản phù hợp. |
(?> lại) | Khớp với mẫu độc lập mà không bị bẻ khóa. |
\ w | Khớp các ký tự từ. |
\ W | Đối sánh các ký tự không phải từ khóa. |
\S | Khớp với khoảng trắng. Tương đương với [\ t \ n \ r \ f]. |
\S | Khớp với khoảng trắng. |
\ d | Khớp các chữ số. Tương đương với [0-9]. |
\ D | Phù hợp với nondigits. |
\ A | Khớp với phần đầu của chuỗi. |
\ Z | Khớp với phần cuối của chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới. |
\ z | Khớp với phần cuối của chuỗi. |
\ G | Khớp với điểm kết thúc trận đấu cuối cùng. |
\ n | Tham chiếu ngược để nắm bắt số "n" của nhóm. |
\ b | Khớp với các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc. |
\ B | Khớp với các ranh giới không phải từ khóa. |
\ n, \ t, v.v. | Khớp với dòng mới, dấu xuống dòng, tab, v.v. |
\ Q | Escape (trích dẫn) tất cả các ký tự lên đến \ E. |
\ E | Kết thúc báo giá bắt đầu bằng \ Q. |
Các phương thức của lớp Matcher
Đây là danh sách các phương thức phiên bản hữu ích:
Phương pháp chỉ mục
Phương thức chỉ mục cung cấp các giá trị chỉ mục hữu ích hiển thị chính xác vị trí khớp được tìm thấy trong chuỗi đầu vào -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public int start() Trả về chỉ số bắt đầu của trận đấu trước đó. |
2 | public 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 đó. |
3 | public int end() Trả về độ lệch sau khi ký tự cuối cùng được khớp. |
4 | public 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 đó. |
Phương pháp học
Các phương pháp nghiên cứu xem xét chuỗi đầu vào và trả về một Boolean cho biết liệu mẫu có được tìm thấy hay không -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | 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. |
2 | 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. |
3 | 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. |
4 | public boolean matches() Cố gắng so khớp toàn bộ khu vực với mẫu. |
Phương pháp thay thế
Phương thức thay thế là phương pháp hữu ích để thay thế văn bản trong một chuỗi đầu vào -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) Triển khai bước nối và thay thế không phải đầu cuối. |
2 | public StringBuffer appendTail(StringBuffer sb) Thực hiện bước nối và thay thế đầu cuối. |
3 | public String replaceAll(String replacement) 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. |
4 | 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. |
5 | 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 đens trong phương thức appendReplacement của lớp Matcher. |
Phương thức bắt đầu và kết thúc
Sau đây là ví dụ đếm số lần từ "cat" xuất hiện trong chuỗi đầu vào:
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());
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Bạn có thể thấy rằng ví dụ này sử dụng các ranh giới từ để đảm bảo rằng các chữ cái "c" "a" "t" 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à trận đấu đã 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à kết thúc trả về chỉ mục của ký tự cuối cùng được so khớp, cộng với một.
Các trận đấu và các phương pháp tìm kiếm
Cả hai phương thức so khớp 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à các trận đấu yêu cầu toàn bộ chuỗi đầu vào phải được đối sánh, trong khi lookAt thì không.
Cả hai phương thức luôn bắt đầu ở đầu chuỗi đầu vào. Đây là ví dụ giải thích về chức năng -
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());
}
}
Điều này sẽ tạo ra kết quả sau:
Output
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
Phương thức ReplaceFirst và ReplaceAll
Các phương thức ReplaceFirst và ReplaceAll thay thế văn bản khớp với một biểu thức chính quy đã cho. Như tên của chúng chỉ ra, ReplaceFirst thay thế lần xuất hiện đầu tiên và ReplaceAll thay thế tất cả các lần xuất hiện.
Đây là ví dụ giải thích về chức năng -
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);
}
}
Điều này sẽ tạo ra kết quả sau:
Output
The cat says meow. All cats say meow.
Phương thức appendReplacement và appendTail
Lớp Matcher cũng cung cấp các phương thức appendReplacement và appendTail để thay thế văn bản.
Đây là ví dụ giải thích về chức năng -
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());
}
}
Điều này sẽ tạo ra kết quả sau:
Output
-foo-foo-foo-
Phương thức lớp ngoại lệ PatternSyntax
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. Lớp PatternSyntaxException cung cấp các phương thức sau để giúp bạn xác định điều gì đã xảy ra -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public String getDescription() Truy xuất mô tả của lỗi. |
2 | public int getIndex() Truy xuất chỉ số lỗi. |
3 | public String getPattern() Truy xuất mẫu biểu thức chính quy bị lỗi. |
4 | public 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. |