Java中Pattern用法實(shí)例(正則表達(dá)式)
1. 正則表達(dá)式的應(yīng)用
在給用戶發(fā)送消息時(shí)通常情況會(huì)有相同的消息模板,但其中部分信息跟用戶相關(guān),因此需要對(duì)消息模板中的變量部分進(jìn)行替換。而對(duì)于一個(gè)系統(tǒng)而言可能有很多套完全不同的模板。因此需要一個(gè)通用的根據(jù)實(shí)際信息替換消息模板中變量的方法。消息模板的變量與velcity中的變量規(guī)范相同。
publicstatic <K, V> String replacePlaceHolderWithMapValue(String msg,Map<K,V> placeHolderMap) {
Patternpattern = Pattern.compile("\\$*!?\\{([\\w]+)\\}");
Matchermatcher = pattern.matcher(msg);
Map<String,String> replaceList = new HashMap();
while(matcher.find()) {
StringplaceHolder = matcher.group(0);
Stringkey = matcher.group(1);
Objectvalue = placeHolderMap.get(key);
if(value != null) {
replaceList.put(placeHolder,value.toString());
}
}
for(Entry<String, String> keyValue:replaceList.entrySet()) {
msg= msg.replace(keyValue.getKey(), keyValue.getValue());
}
returnmsg;
}
方法中先獲取所有的需要替換的變量存入replaceList中,然后再依次替換。上述方法的正則表達(dá)式中,([\\w]+)表示對(duì)匹配的內(nèi)容中進(jìn)行捕獲,捕獲值存入matcher.group中,當(dāng)然也可以有多個(gè)捕獲。
2. 常用正則表達(dá)式
[abc] a、b 或 c(簡(jiǎn)單類)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A 到 Z,兩頭的字母包括在內(nèi)(范圍)
[a-d[m-p]] a到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
. 任何字符(與行結(jié)束符可能匹配也可能不匹配)
\d 數(shù)字:[0-9]
\D 非數(shù)字: [^0-9]
\s 空白字符:[\t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
\p{Lower} 小寫字母字符:[a-z]
\p{Upper} 大寫字母字符:[A-Z]
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次
(X) X,作為捕獲組
非捕獲
(?=X) X,通過零寬度的正lookahead
(?!X) X,通過零寬度的負(fù)lookahead
(?<=X) X,通過零寬度的正lookbehind
(?<!X) X,通過零寬度的負(fù)lookbehind
(?>X) X,作為獨(dú)立的非捕獲組
3 貪婪匹配與懶惰匹配
考慮這個(gè)表達(dá)式:a.*b,它將會(huì)匹配最長(zhǎng)的以a開始,以b結(jié)束的字符串。如果用它來搜索aabab的話,它會(huì)匹配整個(gè)字符串a(chǎn)abab。這被稱為貪婪匹配。
有時(shí),我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉(zhuǎn)化為懶惰匹配模式,只要在它后面加上一個(gè)問號(hào)?。這樣.*?就意味著匹配任意數(shù)量的重復(fù),但是在能使整個(gè)匹配成功的前提下使用最少的重復(fù)。
a.*?b匹配最短的,以a開始,以b結(jié)束的字符串。如果把它應(yīng)用于aabab的話,它會(huì)匹配aab和ab。
public static void main(String[] args) {
String str = "北京市(海淀區(qū))(朝陽區(qū))";
String paternStr = ".*(?=\\()";
Pattern pattern = Pattern.compile(paternStr);
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
}
上述方法的輸出為:北京市(海淀區(qū))
public static void main(String[] args) {
String str = "北京市(海淀區(qū))(朝陽區(qū))";
String paternStr = ".*?(?=\\()";
Pattern pattern = Pattern.compile(paternStr);
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
}
上述方法輸出:北京市
補(bǔ)充:其它的一些用法
Pattern.split(CharSequence input)
這個(gè)方法跟String.split()方法效果類似
Pattern p2 = Pattern.compile("[a-z]+");
// str的長(zhǎng)度為2,返回"我愛"和"哈哈",跟 String[] arr = "我愛java哈哈".
String[] arr = p2.split("我愛java哈哈");
Arrays.stream(arr).forEach(System.out::println);
Pattern.matcher(String regex,CharSequence input)
一個(gè)靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串,效果與Pattern.compile(regex).matcher(input).matches() 類似
Pattern p = Pattern.compile("\\d+");
// 返回\d+
System.out.println(p.pattern());
// p.pattern()返回\d+, 這里為true,只有當(dāng)全部滿足則為true
System.out.println(Pattern.matches(p.pattern(), "2223"));
// 返回false,只要一個(gè)不滿足,則返回false
System.out.println(Pattern.matches(p.pattern(), "2223b"));
總結(jié)
到此這篇關(guān)于Java中Pattern用法實(shí)例的文章就介紹到這了,更多相關(guān)正則表達(dá)式Pattern用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java序列化問題:“Serialized class has not impl
在Java開發(fā)中,序列化(Serialization)是一個(gè)常見的操作,尤其是在分布式系統(tǒng)、網(wǎng)絡(luò)通信或數(shù)據(jù)持久化場(chǎng)景中,然而,序列化過程中可能會(huì)遇到各種問題,其中最常見的一個(gè)錯(cuò)誤是Serialized class has not implement Serializable interface,本文給大家介紹了相關(guān)的解決方法2025-02-02
Spring使用注解進(jìn)行對(duì)象裝配(DI)的操作
獲取Bean對(duì)象也叫做對(duì)象裝配,就是把對(duì)象取出來放到某個(gè)類中,有時(shí)候也叫對(duì)象注入,這篇文章主要介紹了Spring使用注解進(jìn)行對(duì)象裝配(DI),需要的朋友可以參考下2023-07-07
IDEA如何自動(dòng)生成serialVersionUID的設(shè)置
這篇文章主要介紹了IDEA如何自動(dòng)生成 serialVersionUID 的設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java導(dǎo)出Excel通用工具類實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Excel通用工具類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java隊(duì)列同步器之CountDownLatch實(shí)現(xiàn)詳解
這篇文章主要介紹了Java隊(duì)列同步器之CountDownLatch實(shí)現(xiàn)詳解,CountDownLatch是一個(gè)同步工具類,它允許一個(gè)或多個(gè)線程一直等待,直到其他線程執(zhí)行完后再執(zhí)行,例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有框架服務(wù)之后執(zhí)行,需要的朋友可以參考下2023-12-12
如何將JSP/Servlet項(xiàng)目轉(zhuǎn)換為Spring Boot項(xiàng)目
這篇文章主要介紹了如何將JSP/Servlet項(xiàng)目轉(zhuǎn)換為Spring Boot項(xiàng)目,幫助大家更好的利用springboot進(jìn)行網(wǎng)絡(luò)編程,感興趣的朋友可以了解下2020-10-10
關(guān)于Linux服務(wù)器配置java環(huán)境遇到的問題小結(jié)
這篇文章主要介紹了關(guān)于Linux服務(wù)器配置java環(huán)境遇到的問題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

