實(shí)例解析Java程序中正則表達(dá)式的貪婪模式匹配
貪婪模式(Greedy):
數(shù)量表示符默認(rèn)采用貪婪模式,除非另有表示。貪婪模式的表達(dá)式會(huì)一直匹配下去,直到無法匹配為止。如果你發(fā)現(xiàn)表達(dá)式匹配的結(jié)果與預(yù)期的不符,很有可能是因?yàn)椤阋詾楸磉_(dá)式只會(huì)匹配前面幾個(gè)字符,而實(shí)際上它是貪婪模式,所以會(huì)一直匹配下去。
貪婪與非貪婪,加上?為非貪婪:
var s = '1023000'.match(/(\d+)(0*)/); s ["1023000", "1023000", ""] var s = '1023000'.match(/^(\d+)(0*)$/); s ["1023000", "1023000", ""] var s = '1023000'.match(/^(\d+?)(0*)$/); s ["1023000", "1023", "000"] var s = '1023000'.match(/(\d+?)(0*)/); s ["10", "1", "0"]
java 正則表達(dá)式默認(rèn)用的是greedy貪婪匹配模式既是這種類型(.*)的最長匹配,如果需要最短匹配則改為(.*?)即是勉強(qiáng)匹配模式。
原理分析:
如果是貪婪匹配模式,正則表達(dá)式引擎會(huì)一直匹配到字符串最后,當(dāng)匹配為false時(shí),通過
回溯的方式,倒退找到倒數(shù)第一個(gè)匹配位置,返回匹配結(jié)果
如果是勉強(qiáng)匹配模式,正則表達(dá)式引擎會(huì)匹配到符合pattern的末尾位置那個(gè)字符,然后再往后走一步,發(fā)現(xiàn)匹配為false,又回溯到找到回退的最近一個(gè)匹配為true的位置,返回結(jié)果。
看代碼:
例一:
public void test51(){
String str = "aaa\"bbb\"ccc\"ddd\"eee";
System.out.println(str);
str = str.replaceAll("\"(.*)\"", "@");
System.out.println(str);
}
輸出:
aaa"bbb"ccc"ddd"eee aaa@eee
例二:
@Test
public void test52(){
String str = "aaa\"bbb\"ccc\"ddd\"eee";
System.out.println(str);
str = str.replaceAll("\"(.*?)\"", "@");
System.out.println(str);
}
輸出:
aaa"bbb"ccc"ddd"eee aaa@ccc@eee
相關(guān)文章
Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹,本文講解了何時(shí)使用狀態(tài)模式、如何使用狀態(tài)模式等內(nèi)容,需要的朋友可以參考下2015-03-03
讀寫nacos的配置中心的參數(shù)及變動(dòng)監(jiān)聽方式
Spring應(yīng)用可以通過NacosDataSource下載配置參數(shù),使用ConfigService的publishConfig方法更新Nacos上的配置,但同一服務(wù)內(nèi)部更新配置不會(huì)觸發(fā)configUpdate事件,ConfigService也提供了監(jiān)聽事件功能2026-02-02
java8新特性-Stream入門學(xué)習(xí)心得
這篇文章主要介紹了java8新特性-Stream入門學(xué)習(xí)心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
java棧實(shí)現(xiàn)二叉樹的非遞歸遍歷的示例代碼
這篇文章主要介紹了java棧實(shí)現(xiàn)二叉樹的非遞歸遍歷,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Java實(shí)現(xiàn)可視化走迷宮小游戲的示例代碼
這篇文章主要介紹了Java如何實(shí)現(xiàn)可視化走迷宮小游戲。本程序適用于java程序員鞏固類與對(duì)象、文件讀取、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對(duì)邏輯能力的鍛煉,需要的可以參考一下2022-11-11

