一文搞懂Java正則表達式
1 介紹
如果我們想根據(jù)特定的模式表示一組字符串,那么我們應該使用正則表達式。
例如,我們可以編寫一個正則表達式來表示所有有效的電子郵件地址,或者我們可以編寫一個正則表達式來驗證有效的電話號碼等。
使用正則表達式的最重要的應用領域是:
- 開發(fā)驗證框架,如Hibernate Validator。
- 開發(fā)模式匹配工具或應用程序,如Linux中的Ctrl+F或grap cmd。
- 開發(fā)數(shù)字電路
- 開發(fā)翻譯器,如匯編器、編譯器和解釋器等。
- 開發(fā)通信協(xié)議TCP/IP、UDP等。
要在Java中使用正則表達式,我們可以利用java.util.regex包,該包包括以下類:
- Pattern——這個類是一組可以用于定義各種類型模式的正則表達式的編譯(定義在搜索中使用的模式)。
- Matcher——這個對象用于在Java中執(zhí)行匹配操作,用于在輸入字符串中搜索模式。
- PatternSyntaxException——這個類用于指示正則表達式模式中的語法錯誤。
這里是一個正則表達式的示例代碼片段:
import java.util.regex.*;
public class RegularExpression {
public static void main(String[] args) {
int count = 0;
Pattern pattern = Pattern.compile("ab");
Matcher matcher = pattern.matcher("abcbcbcababacb");
while (matcher.find()) {
++count;
System.out.println(matcher.group()+ "...... found at: "+matcher.start());
}
System.out.println("The Total number of occurrence is " + count);
}
}
/****
Output-
ab...... found at: 0
ab...... found at: 7
ab...... found at: 9
The Total number of occurrence is 3
****/2 Pattern
Pattern是一個已編譯的正則表達式,即Java中的模式等價物。我們可以使用Pattern類的compile()方法創(chuàng)建一個模式對象。Pattern類的compile()方法的簽名如下:
Flags——compile()方法中的標志會改變搜索的方式。以下是其中幾個:
- CASE_INSENSITIVE——在執(zhí)行搜索時將忽略字母的大小寫。
- UNICODE_CASE——與CASE_INSENSITIVE標志一起使用,它會忽略英語字母以外的字母的大小寫。
- LITERAL——使用時,模式中的特殊字符將不具有任何特殊含義,在執(zhí)行搜索時只被視為普通字符。
public static Pattern compile(String regex)以下是Pattern類compile()方法的一個示例:
Pattern pattern = Pattern.compile("ab");3 Matcher
matcher對象可用于檢查目標字符串中的指定模式。使用Pattern類的matcher()方法,我們可以生成一個匹配器對象。Pattern類的matcher()方法具有以下簽名:
public Matcher matcher(CharSequence input)以下是Pattern類matcher()方法的示例:
Matcher matcher = pattern.matcher("abcbcbcababacb");Matcher類存在于java.util.regex包中。以下是Matcher類一些最重要的方法:
- boolean find()——這個方法嘗試查找下一個匹配項,在找到匹配項時返回true,否則返回false。
- int start()——這個方法返回匹配項在輸入字符串中的起始索引。
- int end()——這個方法返回匹配項在輸入字符串中的結束索引。
- String group()——這個方法返回匹配的模式。
注意:Pattern和Matcher類存在于java.util.regex包中,從java1.4v開始引入。
4 字符類
- [abc]——要么是'a'、'b'或'c'
- [^abc]——除了'a'、'b'和'c'
- [a-z]——任何從a到z的小寫字母符號
- [A-Z]——任何從A到Z的大寫字母符號
- [a-zA-Z]——任何字母符號
- [0–9]——任何0到9的數(shù)字
- [a-zA-Z0–9]——任何字母數(shù)字符號
- [^a-zA-Z0–9]——除了字母數(shù)字符號(僅限特殊字符)
5 預定義字符類
- .——除換行符外的任何字符
- \d——數(shù)字(0-9)
- \D——非數(shù)字(0-9)
- \w——單詞字符(a-z、A-Z、0-9、_)
- \W——非單詞字符
- \s——空格(空格、制表符、換行符)
- \S——非空格(空格、制表符、換行符)
- \b——單詞邊界
- \B——非單詞邊界
- \uxxxx——由十六進制數(shù)xxxx指定的Unicode字符
6 量詞符
- *——0次或多次
- +——1次或多次
- ?——0次或1次
- {3}——精確數(shù)量3次
- {3,4}——數(shù)字范圍(最小值,最大值)
我們可以使用量詞符指定要匹配的出現(xiàn)次數(shù)。
Pattern類的split()方法
要根據(jù)特定的模式拆分目標字符串,我們可以使用Pattern類的split()方法。Pattern類的split()方法具有以下簽名:
public String[] split(CharSequence input)為了方便,我在這里包含了Pattern類split()方法的代碼片段:
public class RegularExpression {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\s");
String[] splitString = pattern.split("Pattern class is present in java.util.regex");
for (String text : splitString) {
System.out.println(text);
}
}
}
/***
Output -
Pattern
class
is
present
in
java.util.regex
***/在上面的示例中,根據(jù)空格(\s)分割了字符串。
String類的split()方法
String類也包含split()方法。字符串類的split()方法用于根據(jù)特定模式拆分目標字符串。
public class RegularExpression {
public static void main(String[] args) {
String text = "This is example of String class split() method";
String[] strings = text.split("\\s");
for (String s : strings) {
System.out.println(s);
}
}
}
/***
Output
This
is
example
of
String
class
split()
method
***/在上面的例子中,字符串是根據(jù)空白(\s)來劃分的。
注意:Pattern類的split()方法可以接受一個目標字符串作為參數(shù),而String類的split()方法可以接受一個正則表達式作為參數(shù)。
7 StringTokenizer
StringTokenizer是專門用于標記化任務的類。Java.util包中有一個StringTokenizer類。
public class StringTokenizerDemo {
public static void main(String[] args) {
StringTokenizer tokenizer = new StringTokenizer("StringTokenizer class present in java.util package");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
}
}
/***
Output -
StringTokenizer
class
present
in
java.util
package
***/注意:StringTokenizer的默認正則表達式為空格符(\s)。
我們也可以根據(jù)需要傳遞正則表達式,以下是代碼片段有助于你更好地理解:
StringTokenizer tokenizer = new StringTokenizer("05-21-2023","-");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
/***
Output
05
21
2023
***/我列了一些常用的編程正則表達式:



























