1. .*
.
表示匹配除換行符 \n 之外的任何單字符,*
表示零次或多次。所以.*
在一起就表示任意字符出現(xiàn)零次或多次。沒有?
表示貪婪模式。比如a.*b
,它將會匹配最長的以a開始,以b結(jié)束的字符串。如果用它來搜索aabab
的話,它會匹配整個字符串aabab
。這被稱為貪婪匹配。
又比如模式src=`.*`, 它將會匹配最長的以 src=` 開始,以`結(jié)束的最長的字符串。用它來搜索 img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``test.jpg` width=`60px` height=`80px`
2. .*?
?
跟在*或者+后邊用時,表示懶惰模式。也稱非貪婪模式。就是匹配盡可能少的字符。就意味著匹配任意數(shù)量的重復(fù),但是在能使整個匹配成功的前提下使用最少的重復(fù)。
a.*?b
匹配最短的,以a開始,以b結(jié)束的字符串。如果把它應(yīng)用于aabab
的話,它會匹配aab
(第一到第三個字符)和ab
(第四到第五個字符)。
又比如模式 src=`.*?`,它將會匹配 src=` 開始,以 ` 結(jié)束的盡可能短的字符串。且開始和結(jié)束中間可以沒有字符,因為*表示零到多個。用它來搜索 img src=``test.jpg` width=`60px` height=`80px`/>
時,將會返回 src=``。
3. .+?
同上,?
跟在*或者+后邊用時,表示懶惰模式。也稱非貪婪模式。就意味著匹配任意數(shù)量的重復(fù),但是在能使整個匹配成功的前提下使用最少的重復(fù)。
a.+?b
匹配最短的,以a開始,以b結(jié)束的字符串,但a和b中間至少要有一個字符。如果把它應(yīng)用于ababccaab
的話,它會匹配abab
(第一到第四個字符)和aab
(第七到第九個字符)。注意此時匹配結(jié)果不是ab
,ab
和aab
。因為a和b中間至少要有一個字符。
又比如模式 src=`.+?`,它將會匹配 src=` 開始,以 ` 結(jié)束的盡可能短的字符串。且開始和結(jié)束中間必須有字符,因為+表示1到多個。用它來搜索 img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``test.jpg`。注意與.*?
時的區(qū)別,此時不會匹配src=``,因為src=` 和 ` 之間至少有一個字符。
4. 示例代碼
import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.jupiter.api.Test; public class TestRegx { @Test public void testRegx(){ String str = "img src=``test.jpg` width=`60px` height=`80px`/>"; String pattern1 = "src=`.*`"; String pattern2 = "src=`.*?`"; String pattern3 = "src=`.+?`"; Pattern p1 = Pattern.compile(pattern1); Pattern p2 = Pattern.compile(pattern2); Pattern p3 = Pattern.compile(pattern3); Matcher m1 = p1.matcher(str); Matcher m2 = p2.matcher(str); Matcher m3 = p3.matcher(str); System.out.println("根據(jù)pattern1匹配的結(jié)果:"); if (m1.find()) { for(int i=0; i=m1.groupCount(); i++){ System.out.println(m1.group(i)); } } System.out.println("根據(jù)pattern2匹配的結(jié)果:"); if (m2.find()) { for(int i=0; i=m2.groupCount(); i++){ System.out.println(m2.group(i)); } } System.out.println("根據(jù)pattern3匹配的結(jié)果:"); if (m3.find()) { for(int i=0; i=m3.groupCount(); i++){ System.out.println(m3.group(i)); } } String[] str1 = p1.split(str); String[] str2 = p2.split(str); String[] str3 = p3.split(str); System.out.println("根據(jù)pattern1切分的結(jié)果"); for (int i=0; i str1.length; i++) { System.out.println(str1[i]); } System.out.println("根據(jù)pattern2切分的結(jié)果"); for (int i=0; i str2.length; i++) { System.out.println(str2[i]); } System.out.println("根據(jù)pattern3切分的結(jié)果"); for (int i=0; i str3.length; i++) { System.out.println(str3[i]); } } }
5. 示例結(jié)果
總結(jié)
到此這篇關(guān)于解析正則表達(dá)式中的.*,.*?,.+?的含義的文章就介紹到這了,更多相關(guān)正則表達(dá)式.*,.*?,.+?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:哈密 常州 本溪 湖州 泰安 涼山 大興安嶺 ???/a>
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解析正則表達(dá)式中的.*,.*?,.+?的含義》,本文關(guān)鍵詞 解析,正則,表達(dá)式,中的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。