java正則表達(dá)式用法大全(深度好文)
一、概念
正則表達(dá)式(regex)是一個(gè)字符串,由字面值字符和特殊符號(hào)組成,是用來(lái)描述匹配一個(gè)字符串集合的模式,可以用來(lái)匹配、替換和拆分字符串。
例如可以檢查一個(gè)字符串是否含有某種子字符串、將匹配的子字符串做替換或者從某個(gè)字符串中取出符合某個(gè)條件的子字符串等。
二、正則表達(dá)式語(yǔ)法
| 字符 | 匹配 | 示例 |
| . | 任意單個(gè)字符,除換行符外 | jav.匹配java |
| [ ] | [ ] 中的任意一個(gè)字符 | java匹配j[abc]va |
| - | [ ] 內(nèi)表示字符范圍 | java匹配[a-z]av[a-g] |
| ^ | 在[ ]內(nèi)的開頭,匹配除[ ]內(nèi)的字符之外的任意一個(gè)字符 | java匹配j[^b-f]va |
| | | 或 | x|y匹配x或y |
| \ | 將下一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符 | \(匹配( |
| $ | 匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,$ 還會(huì)與"\n"或"\r"之前的位置匹配。 | ;$匹配位于一行及外圍的;號(hào) |
| * | 零次或多次匹配前面的字符 | zo*匹配zoo或z |
| + | 一次或多次匹配前面的字符 | zo+匹配zo或zoo |
| ? | 零次或一次匹配前面的字符 | zo?匹配z或zo |
| p{n} | n 是非負(fù)整數(shù)。正好匹配 n 次 | o{2}匹配food中的兩個(gè)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中的三個(gè)o |
| \p{P} | 一個(gè)標(biāo)點(diǎn)字符 !"#$%&'()*+,-./:;<=>?@[\]^_'{|}~ | J\p{P}a匹配J?a |
| \b | 匹配一個(gè)字邊界 | 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 | 匹配換頁(yè)符 | 等效于\x0c和\cL |
| \n | 匹配換行符 | 等效于\x0a和\cJ |
注意:
- 不要在重復(fù)詞符中使用空白。如B{3,6} ,不能寫成 B{3, 6}。
- 可以使用括號(hào)來(lái)將模式分組。(ab){3}匹配ababab , 而ab{3} 匹配 abbb。
三、捕獲組
1. 捕獲組是把多個(gè)字符當(dāng)成一個(gè)單獨(dú)單元進(jìn)行處理的方法,它通過(guò)對(duì)括號(hào)內(nèi)的字符分組來(lái)創(chuàng)建。
捕獲組通過(guò)從左到右計(jì)算其括號(hào)來(lái)編號(hào)。
例如:在表達(dá)式((A)(B(C))) 中,存在四個(gè)這樣的組:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
2. 捕獲組可以通過(guò)調(diào)用matcher對(duì)象的groupCount方法來(lái)查看表達(dá)式有多少個(gè)分組。(groupCount方法返回一個(gè)int值,來(lái)表示matcher對(duì)象當(dāng)前有多少個(gè)捕獲組)
3. 還有一個(gè)特殊的組零(group(0)),它代表整個(gè)表達(dá)式。(該組不包括在groupCount的返回值中)
4. 以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對(duì)組合計(jì)進(jìn)行計(jì)數(shù)。
四、Pattern類與Matcher類
Java的正則表達(dá)式是由java.util.regex的Pattern和Matcher類實(shí)現(xiàn)的。Pattern對(duì)象表示經(jīng)編譯的正則表達(dá)式。靜態(tài)的compile( )方法負(fù)責(zé)將表示正則表達(dá)式的字符串編譯成Pattern對(duì)象。
1.matches( )
boolean flag = str.matches(regex);
可以快速判斷能否在str中找到regex。
2.split( )
String[ ] ss = s.split(regex);
用regex把字符串分隔開來(lái),返回String數(shù)組。
3.find( )
while(matcher.find(i)){
i++;
}Matcher.find( )的功能是發(fā)現(xiàn)CharSequence里的,與pattern相匹配的多個(gè)字符序列。
4.group
A(B(C))D 里面有三個(gè)組:
group(0) 是 ABCD
group(1) 是 BC
group(2) 是 C
形式為 matcher.group( )
5.start( )和end( )
如果匹配成功,start( )會(huì)返回此次匹配的開始位置,end( )會(huì)返回此次匹配的結(jié)束位置,即最后一個(gè)字符的下標(biāo)加一。
如果之前的匹配不成功(或者沒(méi)匹配),那么無(wú)論是調(diào)用start( )還是end( ),都會(huì)引發(fā)一 個(gè)IllegalStateException。
matcher.start( ); matcher.end( );
6.replace替換
replaceFirst(String replacement)將字符串里,第一個(gè)與模式相匹配的子串替換成replacement。
replaceAll(String replacement),將輸入字符串里所有與模式相匹配的子串全部替換成replacement。
String result = s.replaceAll(regex,ss); String result = s.replaceFirst(regex,ss);
7.reset( )
用reset( )方法可以給現(xiàn)有的Matcher對(duì)象配上個(gè)新的CharSequence。
如果不給參數(shù),reset( )會(huì)把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+");
//如果想忽略大小寫敏感度,可以使用線面這個(gè)語(yǔ)句
//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)建一個(gè)新的pattern和matcher以用選項(xiàng)卡替換空格s
Pattern replace = Pattern.compile("\\s+");
Matcher matcher2 = replace.matcher(example);
System.out.println(matcher2.replaceAll("\t"));
}
}
五、正則表達(dá)式在Java中的應(yīng)用
1.判斷功能
例:判斷輸入的手機(jī)號(hào)是否為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("請(qǐng)輸入手機(jī)號(hào):");
String str = input.nextLine();
String regex = "1[38]\\d{9}";//用正則表達(dá)式定義手機(jī)號(hào)規(guī)則
boolean flag = str.matches(regex);
System.out.println("手機(jī)號(hào)是:"+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("請(qǐng)輸入年齡:");
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于MD5算法原理與常用實(shí)現(xiàn)方式
這篇文章主要介紹了關(guān)于MD5算法原理與常用實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
簡(jiǎn)單總結(jié)Java的反射機(jī)制的運(yùn)用
這篇文章主要介紹了Java的反射機(jī)制的運(yùn)用,對(duì)一些常用的類作了一些說(shuō)明,需要的朋友可以參考下2015-11-11
手把手教你搭建第一個(gè)Spring Batch項(xiàng)目的步驟
這篇文章主要介紹了手把手教你搭建第一個(gè)Spring Batch項(xiàng)目的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java函數(shù)接口和Lambda表達(dá)式深入分析
這篇文章主要介紹了Java函數(shù)接口和Lambda表達(dá)式,函數(shù)接口是一個(gè)具有單個(gè)抽象方法的接口,接口設(shè)計(jì)主要是為了支持Lambda表達(dá)式和方法引用,使得Java能更方便地實(shí)現(xiàn)函數(shù)式編程風(fēng)格,需要的朋友可以參考下2025-04-04
Springboot整合多數(shù)據(jù)源代碼示例詳解
這篇文章主要介紹了Springboot整合多數(shù)據(jù)源代碼示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot2零基礎(chǔ)到精通之profile功能與自定義starter
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)profile功能與自定義starter2022-03-03
Maven多模塊項(xiàng)目調(diào)試與問(wèn)題排查的完整指南
在現(xiàn)代企業(yè)級(jí)Java開發(fā)中,Maven多模塊項(xiàng)目因其清晰的代碼組織,依賴管理和高效的構(gòu)建流程已成為主流架構(gòu)模式,本文深入剖析多模塊項(xiàng)目的四大核心痛點(diǎn)解決方案,感興趣的小伙伴可以跟隨小編一起了解下2025-06-06
Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例
這篇文章主要介紹了Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

