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)的開(kā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} ,不能寫(xiě)成 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. 以 (?) 開(kāi)頭的組是純的非捕獲 組,它不捕獲文本,也不針對(duì)組合計(jì)進(jìn)行計(jì)數(shù)。
四、Pattern類(lèi)與Matcher類(lèi)
Java的正則表達(dá)式是由java.util.regex的Pattern和Matcher類(lèi)實(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把字符串分隔開(kāi)來(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ì)返回此次匹配的開(kāi)始位置,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)前字符串的開(kāi)始處。
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+");
//如果想忽略大小寫(xiě)敏感度,可以使用線面這個(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開(kāi)頭
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)文章
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實(shí)現(xiàn)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+Easyui+maven+mysql實(shí)現(xiàn)一個(gè)養(yǎng)老院管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-03-03
詳解spring cloud hystrix請(qǐng)求緩存(request cache)
這篇文章主要介紹了詳解spring cloud hystrix請(qǐng)求緩存(request cache),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
java連接SQL?Server數(shù)據(jù)庫(kù)圖文教程(自用)
在Java應(yīng)用程序中,我們經(jīng)常需要與數(shù)據(jù)庫(kù)進(jìn)行交互,下面這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
SpringBoot集成Dubbo啟用gRPC協(xié)議
這篇文章主要介紹了SpringBoot集成Dubbo啟用gRPC協(xié)議,以及與原生 gRPC 在代碼編寫(xiě)過(guò)程中的區(qū)別。感興趣的同學(xué)可以參考閱讀2023-04-04
java實(shí)現(xiàn)簡(jiǎn)單撲克牌游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單撲克牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
java使用poi讀取excel內(nèi)容方法實(shí)例
本文介紹java使用poi讀取excel內(nèi)容的實(shí)例,大家參考使用吧2014-01-01

