単純-正規表現貪欲と非貪欲モード
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部分をマッチングします.
たとえば、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"