単純-正規表現貪欲と非貪欲モード

1692 ワード

1.正規表現の貪欲さと非貪欲さのマッチングとは
たとえば、String str="abcaxc";
    Patter p="ab*c";
貪欲マッチング:正規表現は一般的に最大長マッチング、すなわちいわゆる貪欲マッチングに傾いている.パターンpを使用して文字列strをマッチングすると、abcaxc(ab*c)にマッチングします.
欲張りでないマッチング:結果にマッチングすればいいので、マッチング文字が少なくなります.パターンpを使用して文字列strをマッチングすると、abc(ab*c)にマッチングします.
2.プログラミングで2つのパターンをどのように区別するか
デフォルトは欲張りモードです.量詞の後ろに直接疑問符をつけますか?非貪欲なパターンです
量詞:{m,n}:mからn個
*:任意の複数
+:1~複数
     ?:0または1
3.プログラムの例
Snortのルール1つのルールの一部をマッチングテキストとして使用し、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));
        }
    }
}
以下はconsole表示の結果です
  :(content:"rcpt to root";pcre:"word";)
    :content:".+"
    :content:"rcpt to root";pcre:"word"
     :content:".+?"
    :content:"rcpt to root"