正則中的貪婪與非貪婪

貪婪就是儘量往多的匹配 比如 +  -->一次或多次,優先匹配更多的
非貪婪就是儘量少的匹配 比如 ? -->0或者1次 ,優先匹配少的
在貪戀匹配後面加上?就變爲了非貪婪匹配

正則表達式貪婪與非貪婪模式
之前做程序的時候看到過正則表達式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裏總結一下,以備自己以後用到注意。
1.什麼是正則表達式的貪婪與非貪婪匹配
  如:String str="abcaxc";
    Patter p="ab.*c";
  貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab.*c)。
  非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:abc(ab.*c)。
2.編程中如何區分兩種模式
  默認是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。
  量詞:{m,n}:m到n個
     *:任意多個
     +:一個到多個
     ?:0或一個
3.程序實例
使用Snort的規則一條規則的一部分作爲匹配文本,匹配出其中的content部分。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegularTest {
    
    public static void main(String[] arg){
        String text="(content:\"rcpt to root\";pcre:\"word\";)";
        String rule1="content:\".+\"";    //貪婪模式
        String rule2="content:\".+?\"";    //非貪婪模式
        
        System.out.println("文本:"+text);
        System.out.println("貪婪模式:"+rule1);
        Pattern p1 =Pattern.compile(rule1);
        Matcher m1 = p1.matcher(text);
        while(m1.find()){
            System.out.println("匹配結果:"+m1.group(0));
        }
        
        System.out.println("非貪婪模式:"+rule2);
        Pattern p2 =Pattern.compile(rule2);
        Matcher m2 = p2.matcher(text);
        while(m2.find()){
            System.out.println("匹配結果:"+m2.group(0));
        }
    }
}

執行結果:

 4.注意
  在linux C 下面沒有編譯成功使用?號的非貪婪模式。
   網上的一句話:the ? only works for Perl-based regexp, not for POSIX...

 

發佈了62 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章