實(shí)例解析Java程序中正則表達(dá)式的貪婪模式匹配
貪婪模式(Greedy):
數(shù)量表示符默認(rèn)采用貪婪模式,除非另有表示。貪婪模式的表達(dá)式會(huì)一直匹配下去,直到無(wú)法匹配為止。如果你發(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貪婪匹配模式既是這種類(lèi)型(.*)的最長(zhǎng)匹配,如果需要最短匹配則改為(.*?)即是勉強(qiáng)匹配模式。
原理分析:
如果是貪婪匹配模式,正則表達(dá)式引擎會(huì)一直匹配到字符串最后,當(dāng)匹配為false時(shí),通過(guò)
回溯的方式,倒退找到倒數(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
- Java/Js下使用正則表達(dá)式匹配嵌套Html標(biāo)簽
- java正則表達(dá)式四種常用的處理方式(匹配、分割、替代、獲取)
- JAVA中正則表達(dá)式匹配,替換,查找,切割的方法
- java正則表達(dá)式匹配網(wǎng)頁(yè)所有網(wǎng)址和鏈接文字的示例
- Java使用正則表達(dá)式(regex)匹配中文實(shí)例代碼
- Java基于正則表達(dá)式實(shí)現(xiàn)查找匹配的文本功能【經(jīng)典實(shí)例】
- 學(xué)習(xí)Java正則表達(dá)式(匹配、替換、查找)
- Java 正則表達(dá)式匹配模式(貪婪型、勉強(qiáng)型、占有型)
- Java正則表達(dá)式實(shí)現(xiàn)在文本中匹配查找換行符的方法【經(jīng)典實(shí)例】
- Java基于正則表達(dá)式實(shí)現(xiàn)的替換匹配文本功能【經(jīng)典實(shí)例】
- Java使用正則表達(dá)式匹配獲取鏈接地址的方法示例
相關(guān)文章
在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署
這篇文章主要為大家介紹了在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06使用java打印心型、圓形圖案的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用java打印心型、圓形圖案的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12保證緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性詳解
在實(shí)際開(kāi)發(fā)過(guò)程中,緩存的使用頻率是非常高的,只要使用緩存和數(shù)據(jù)庫(kù)存儲(chǔ),就難免會(huì)出現(xiàn)雙寫(xiě)時(shí)數(shù)據(jù)一致性的問(wèn)題,本文主要介紹了如何保證緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,需要的小伙伴可以參考閱讀2023-04-04SpringBoot EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解
項(xiàng)目里使用的是EasyPoi來(lái)處理導(dǎo)入導(dǎo)出功能的。近日因業(yè)務(wù)需求調(diào)整,一些導(dǎo)出功能的導(dǎo)出列需要根據(jù)不同的條件動(dòng)態(tài)導(dǎo)出2022-09-09