正則表達式(.*?)


先看一下,下面是C#實現提取小括號內的內容的示例代碼

                string str = "aaaaaaaaa(bbbbbb) 121 (fdsa) 121(aa)2121jlkoihj";
                string pattern = @"\(.*?\)";//匹配模式
                Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
                MatchCollection matches = regex.Matches(str);
                StringBuilder sb = new StringBuilder();//存放匹配結果
                foreach (Match match in matches)
                {
                    string value = match.Value;
                    sb.AppendLine(value);
                }

返回的結果是:

(bbbbbb)
(fdsa)
(aa)

 

下面是輔助資料

從網上搜的,留下來認真地再看一下

1、. 匹配任意除換行符“\n”外的字符;
2、*表示匹配前一個字符0次或無限次;
3、+或*后跟?表示非貪婪匹配,即盡可能少的匹配,如*?重復任意次,但盡可能少重復;
4、 .*? 表示匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。如:a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用於aabab的話,它會匹配aab和ab。

 

下面是主詳細解釋

1. .*
. 表示 匹配除換行符 \n 之外的任何單字符,*表示零次或多次。所以.*在一起就表示任意字符出現零次或多次。沒有?表示貪婪模式。比如a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。
又比如模式src=`.*`, 它將會匹配最長的以 src=` 開始,以`結束的最長的字符串。用它來搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``test.jpg` width=`60px` height=`80px`

2. .*?
?跟在*或者+后邊用時,表示懶惰模式。也稱非貪婪模式。就是匹配盡可能少的字符。就意味着匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。
a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)。
又比如模式 src=`.*?`,它將會匹配 src=` 開始,以 ` 結束的盡可能短的字符串。且開始和結束中間可以沒有字符,因為*表示零到多個。用它來搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``。

3. .+?
同上,?跟在*或者+后邊用時,表示懶惰模式。也稱非貪婪模式。就意味着匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。
a.+?b匹配最短的,以a開始,以b結束的字符串,但a和b中間至少要有一個字符。如果把它應用於ababccaab的話,它會匹配abab(第一到第四個字符)和aab(第七到第九個字符)。注意此時匹配結果不是ab,ab和aab。因為a和b中間至少要有一個字符。
又比如模式 src=`.+?`,它將會匹配 src=` 開始,以 ` 結束的盡可能短的字符串。且開始和結束中間必須有字符,因為+表示1到多個。用它來搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``test.jpg`。注意與.*?時的區別,此時不會匹配src=``,因為src=` 和 ` 之間至少有一個字符。

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匹配的結果:");
    if (m1.find()) {
      for(int i=0; i<=m1.groupCount(); i++){
        System.out.println(m1.group(i));
      }
    }

    System.out.println("根據pattern2匹配的結果:");
    if (m2.find()) {
      for(int i=0; i<=m2.groupCount(); i++){
        System.out.println(m2.group(i));
      }
    }

    System.out.println("根據pattern3匹配的結果:");
    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切分的結果");
    for (int i=0; i< str1.length; i++) {
      System.out.println(str1[i]);
    }

    System.out.println("根據pattern2切分的結果");
    for (int i=0; i< str2.length; i++) {
      System.out.println(str2[i]);
    }

    System.out.println("根據pattern3切分的結果");
    for (int i=0; i< str3.length; i++) {
      System.out.println(str3[i]);
    }
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM