貪婪就是儘量往多的匹配 比如 + -->一次或多次,優先匹配更多的
非貪婪就是儘量少的匹配 比如 ? -->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...