java正則表達(dá)式用法大全(深度好文)
一、概念
正則表達(dá)式(regex)是一個字符串,由字面值字符和特殊符號組成,是用來描述匹配一個字符串集合的模式,可以用來匹配、替換和拆分字符串。
例如可以檢查一個字符串是否含有某種子字符串、將匹配的子字符串做替換或者從某個字符串中取出符合某個條件的子字符串等。
二、正則表達(dá)式語法
| 字符 | 匹配 | 示例 |
| . | 任意單個字符,除換行符外 | jav.匹配java |
| [ ] | [ ] 中的任意一個字符 | java匹配j[abc]va |
| - | [ ] 內(nèi)表示字符范圍 | java匹配[a-z]av[a-g] |
| ^ | 在[ ]內(nèi)的開頭,匹配除[ ]內(nèi)的字符之外的任意一個字符 | java匹配j[^b-f]va |
| | | 或 | x|y匹配x或y |
| \ | 將下一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符 | \(匹配( |
| $ | 匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,$ 還會與"\n"或"\r"之前的位置匹配。 | ;$匹配位于一行及外圍的;號 |
| * | 零次或多次匹配前面的字符 | zo*匹配zoo或z |
| + | 一次或多次匹配前面的字符 | zo+匹配zo或zoo |
| ? | 零次或一次匹配前面的字符 | zo?匹配z或zo |
| p{n} | n 是非負(fù)整數(shù)。正好匹配 n 次 | o{2}匹配food中的兩個o |
| p{n,} | n 是非負(fù)整數(shù)。至少匹配 n 次 | o{2}匹配foood中的所有o |
| p{n,m} | M 和 n 是非負(fù)整數(shù),其中 n <= m。匹配至少 n 次,至多 m 次 | o{1,3}匹配fooood中的三個o |
| \p{P} | 一個標(biāo)點字符 !"#$%&'()*+,-./:;<=>?@[\]^_'{|}~ | J\p{P}a匹配J?a |
| \b | 匹配一個字邊界 | va\b匹配java中的va,但不匹配javar中的va |
| \B | 非字邊界匹配 | va\B匹配javar中的va,但不匹配java中的va |
| \d | 數(shù)字字符匹配 | 1[\\d]匹配13 |
| \D | 非數(shù)字字符匹配 | [\\D]java匹配Jjava |
| \w | 單詞字符 | java匹配[\\w]ava |
| \W | 非單詞字符 | $java匹配[\\W]java |
| \s | 空白字符 | Java 2匹配Java\\s2 |
| \S | 非空白字符 | java匹配 j[\\S]va |
| \f | 匹配換頁符 | 等效于\x0c和\cL |
| \n | 匹配換行符 | 等效于\x0a和\cJ |
注意:
- 不要在重復(fù)詞符中使用空白。如B{3,6} ,不能寫成 B{3, 6}。
- 可以使用括號來將模式分組。(ab){3}匹配ababab , 而ab{3} 匹配 abbb。
三、捕獲組
1. 捕獲組是把多個字符當(dāng)成一個單獨單元進(jìn)行處理的方法,它通過對括號內(nèi)的字符分組來創(chuàng)建。
捕獲組通過從左到右計算其括號來編號。
例如:在表達(dá)式((A)(B(C))) 中,存在四個這樣的組:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
2. 捕獲組可以通過調(diào)用matcher對象的groupCount方法來查看表達(dá)式有多少個分組。(groupCount方法返回一個int值,來表示matcher對象當(dāng)前有多少個捕獲組)
3. 還有一個特殊的組零(group(0)),它代表整個表達(dá)式。(該組不包括在groupCount的返回值中)
4. 以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進(jìn)行計數(shù)。
四、Pattern類與Matcher類
Java的正則表達(dá)式是由java.util.regex的Pattern和Matcher類實現(xiàn)的。Pattern對象表示經(jīng)編譯的正則表達(dá)式。靜態(tài)的compile( )方法負(fù)責(zé)將表示正則表達(dá)式的字符串編譯成Pattern對象。
1.matches( )
boolean flag = str.matches(regex);
可以快速判斷能否在str中找到regex。
2.split( )
String[ ] ss = s.split(regex);
用regex把字符串分隔開來,返回String數(shù)組。
3.find( )
while(matcher.find(i)){
i++;
}Matcher.find( )的功能是發(fā)現(xiàn)CharSequence里的,與pattern相匹配的多個字符序列。
4.group
A(B(C))D 里面有三個組:
group(0) 是 ABCD
group(1) 是 BC
group(2) 是 C
形式為 matcher.group( )
5.start( )和end( )
如果匹配成功,start( )會返回此次匹配的開始位置,end( )會返回此次匹配的結(jié)束位置,即最后一個字符的下標(biāo)加一。
如果之前的匹配不成功(或者沒匹配),那么無論是調(diào)用start( )還是end( ),都會引發(fā)一 個IllegalStateException。
matcher.start( ); matcher.end( );
6.replace替換
replaceFirst(String replacement)將字符串里,第一個與模式相匹配的子串替換成replacement。
replaceAll(String replacement),將輸入字符串里所有與模式相匹配的子串全部替換成replacement。
String result = s.replaceAll(regex,ss); String result = s.replaceFirst(regex,ss);
7.reset( )
用reset( )方法可以給現(xiàn)有的Matcher對象配上個新的CharSequence。
如果不給參數(shù),reset( )會把Matcher設(shè)到當(dāng)前字符串的開始處。
m.reset("java");8.代碼演示
package zuoye2;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EXjava {
public static void main(String[] args) {
String example = "This is a small example string";
Pattern pattern = Pattern.compile("\\w+");
//如果想忽略大小寫敏感度,可以使用線面這個語句
//Pattern pattern = Pattern.compile("\\s+",Patttern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(example);
while(matcher.find()) {
System.out.print("start index: "+matcher.start());
System.out.print(" end index: "+ matcher.end()+" ");
System.out.println(matcher.group());
}
//創(chuàng)建一個新的pattern和matcher以用選項卡替換空格s
Pattern replace = Pattern.compile("\\s+");
Matcher matcher2 = replace.matcher(example);
System.out.println(matcher2.replaceAll("\t"));
}
}
五、正則表達(dá)式在Java中的應(yīng)用
1.判斷功能
例:判斷輸入的手機(jī)號是否為13或者18開頭
package zuoye2;
import java.util.Scanner;
public class EXjava {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("請輸入手機(jī)號:");
String str = input.nextLine();
String regex = "1[38]\\d{9}";//用正則表達(dá)式定義手機(jī)號規(guī)則
boolean flag = str.matches(regex);
System.out.println("手機(jī)號是:"+flag);
input.close();
}
}2.分割功能
例:分割年齡段
package zuoye2;
import java.util.Scanner;
public class EXjava {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String age = "18-30";//定義年齡范圍
String regex = "-";
String[] strArr = age.split(regex);//分割成字符串?dāng)?shù)組
int startage = Integer.parseInt(strArr[0]);
int endage = Integer.parseInt(strArr[1]);
System.out.print("請輸入年齡:");
int a = input.nextInt();
if(a >= startage && a <= endage) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
input.close();
}
}3.替換功能
例:將字符串的數(shù)字替換成 *
package zuoye2;
import java.util.Scanner;
public class EXjava {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = "12342javawang2345";
String regex = "\\d";
String ss = "*";
//將字符串里面的數(shù)字替換成*
String result = s.replaceAll(regex, ss);
System.out.println(result);
input.close();
}
}總結(jié)
到此這篇關(guān)于java正則表達(dá)式用法大全的文章就介紹到這了,更多相關(guān)java正則表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java畢業(yè)設(shè)計實戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實現(xiàn)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+Easyui+maven+mysql實現(xiàn)一個養(yǎng)老院管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-03-03
詳解spring cloud hystrix請求緩存(request cache)
這篇文章主要介紹了詳解spring cloud hystrix請求緩存(request cache),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
java連接SQL?Server數(shù)據(jù)庫圖文教程(自用)
在Java應(yīng)用程序中,我們經(jīng)常需要與數(shù)據(jù)庫進(jìn)行交互,下面這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
SpringBoot集成Dubbo啟用gRPC協(xié)議
這篇文章主要介紹了SpringBoot集成Dubbo啟用gRPC協(xié)議,以及與原生 gRPC 在代碼編寫過程中的區(qū)別。感興趣的同學(xué)可以參考閱讀2023-04-04

