非貪欲な一致が機能しないのはなぜですか? 次の例を見てください。
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
非貪欲な一致が機能しないのはなぜですか? 次の例を見てください。
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
.*?
正規表現のは、 \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, "]"
}
期待どおりに動作しています。非貪欲な一致は、必要なだけ一致し、入力では、一致する最小文字は最初のコロンから次のced
.
消費する文字数を制限してみてください。たとえば、用語を「最大 3 文字」に制限するには:
:.{0,3}ced
できるだけ近くに分割するにced
は、次の正規表現で否定先読みを使用します。
:(?!.*:.*ced).*ced
これにより、より近いコロンが存在しないことが保証されced
ます。