3

非貪欲な一致が機能しないのはなぜですか? 次の例を見てください。

public String nonGreedy(){
   String str2 = "abc|s:0:\"gef\";s:2:\"ced\"";
   return str2.split(":.*?ced")[0];
}

私の目には、結果は次のようになるはずですabc|s:0:\"gef\";s:2が、次のとおりです。abc|s

4

2 に答える 2

2

.*?正規表現のは、 \n(0回以上、可能な限り一致する)以外の任意の文字に一致します。

正規表現を試すことができます:

:[^:]*?ced

別の注意として、式を毎回再コンパイルするのを避けるために、次のような定数パターンを使用する必要があります。

private static final Pattern REGEX_PATTERN = 
        Pattern.compile(":[^:]*?ced");

public static void main(String[] args) {
    String input = "abc|s:0:\"gef\";s:2:\"ced\"";
    System.out.println(java.util.Arrays.toString(
        REGEX_PATTERN.split(input)
    )); // prints "[abc|s:0:"gef";s:2, "]"
}
于 2013-08-16T20:16:48.893 に答える
1

期待どおりに動作しています。非貪欲な一致は、必要なだけ一致し、入力では、一致する最小文字は最初のコロンから次のced.

消費する文字数を制限してみてください。たとえば、用語を「最大 3 文字」に制限するには:

:.{0,3}ced

できるだけ近くに分割するにcedは、次の正規表現で否定先読みを使用します。

:(?!.*:.*ced).*ced

これにより、より近いコロンが存在しないことが保証されcedます。

于 2013-08-16T23:32:41.683 に答える