關于(yú)正則表達式中的(de).*,.*?,.+?的(de)理解
發表時(shí)間:2019-7-5
發布人(rén):融晨科技
浏覽次數:224
1. .*
.
表示 匹配除換行符 \n 之(zhī)外的(de)任何單字符,*
表示零次或多次。所以(yǐ).*
在(zài)一起就(jiù)表示任意字符出(chū)現零次或多次。沒有?
表示貪婪模式。比如a.*b
,它将會匹配最長的(de)以(yǐ)a開始,以(yǐ)b結束的(de)字符串。如果用它來(lái)搜索aabab
的(de)話,它會匹配整個(gè)字符串aabab
。這(zhè)被稱爲(wéi / wèi)貪婪匹配。
又比如模式src=`.*`, 它将會匹配最長的(de)以(yǐ) src=` 開始,以(yǐ)`結束的(de)最長的(de)字符串。用它來(lái)搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時(shí),将會返回 src=``test.jpg` width=`60px` height=`80px`
2. .*?
?
跟在(zài)*或者+後邊用時(shí),表示懶惰模式。也(yě)稱非貪婪模式。就(jiù)是(shì)匹配盡可能少的(de)字符。就(jiù)意味着匹配任意數量的(de)重複,但是(shì)在(zài)能使整個(gè)匹配成功的(de)前提下使用最少的(de)重複。
a.*?b
匹配最短的(de),以(yǐ)a開始,以(yǐ)b結束的(de)字符串。如果把它應用于(yú)aabab
的(de)話,它會匹配aab
(第一到(dào)第三個(gè)字符)和(hé / huò)ab
(第四到(dào)第五個(gè)字符)。
又比如模式 src=`.*?`,它将會匹配 src=` 開始,以(yǐ) ` 結束的(de)盡可能短的(de)字符串。且開始和(hé / huò)結束中間可以(yǐ)沒有字符,因爲(wéi / wèi)*表示零到(dào)多個(gè)。用它來(lái)搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時(shí),将會返回 src=``。
3. .+?
同上(shàng),?
跟在(zài)*或者+後邊用時(shí),表示懶惰模式。也(yě)稱非貪婪模式。就(jiù)意味着匹配任意數量的(de)重複,但是(shì)在(zài)能使整個(gè)匹配成功的(de)前提下使用最少的(de)重複。
a.+?b
匹配最短的(de),以(yǐ)a開始,以(yǐ)b結束的(de)字符串,但a和(hé / huò)b中間至少要(yào / yāo)有一個(gè)字符。如果把它應用于(yú)ababccaab
的(de)話,它會匹配abab
(第一到(dào)第四個(gè)字符)和(hé / huò)aab
(第七到(dào)第九個(gè)字符)。注意此時(shí)匹配結果不(bù)是(shì)ab
,ab
和(hé / huò)aab
。因爲(wéi / wèi)a和(hé / huò)b中間至少要(yào / yāo)有一個(gè)字符。
又比如模式 src=`.+?`,它将會匹配 src=` 開始,以(yǐ) ` 結束的(de)盡可能短的(de)字符串。且開始和(hé / huò)結束中間必須有字符,因爲(wéi / wèi)+表示1到(dào)多個(gè)。用它來(lái)搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時(shí),将會返回 src=``test.jpg`。注意與.*?
時(shí)的(de)區别,此時(shí)不(bù)會匹配src=``,因爲(wéi / wèi)src=` 和(hé / huò) ` 之(zhī)間至少有一個(gè)字符。
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("根據pattern1匹配的(de)結果:");
if (m1.find()) {
for(int i=0; i<=m1.groupCount(); i++){
System.out.println(m1.group(i));
}
}
System.out.println("根據pattern2匹配的(de)結果:");
if (m2.find()) {
for(int i=0; i<=m2.groupCount(); i++){
System.out.println(m2.group(i));
}
}
System.out.println("根據pattern3匹配的(de)結果:");
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("根據pattern1切分的(de)結果");
for (int i=0; i< str1.length; i++) {
System.out.println(str1[i]);
}
System.out.println("根據pattern2切分的(de)結果");
for (int i=0; i< str2.length; i++) {
System.out.println(str2[i]);
}
System.out.println("根據pattern3切分的(de)結果");
for (int i=0; i< str3.length; i++) {
System.out.println(str3[i]);
}
}
}