2

誰でも正規表現を手伝ってもらえますか? このコードはうまくいきます。

public static void main(String[] args) {

    String s = "with name=successfully already exist\n";

    Pattern p = Pattern.compile(".+name=.*successfully.+", Pattern.DOTALL);
    java.util.regex.Matcher m = p.matcher(s);

    if (m.matches()) {
        System.out.println("match");
    } else {
        System.out.println("not match");
    }

}

しかし、このコードは「一致しません」を返します。なんで?

public static void main(String[] args) {

    String s = "with name=successfully already exist\n";

    if (s.matches(".+name=.*successfully.+")) {
        System.out.println("match");
    } else {
        System.out.println("not match");
    }

}
4

2 に答える 2

5

2 つの唯一の違いは、最初の例の DOTALL フラグです。

そのフラグ\nがないと、文字列の最後の は最後のパターン ( .+) と一致しません。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#DOTALL

dotall モードでは、式 . 行末記号を含む任意の文字に一致します。デフォルトでは、この式は行末記号と一致しません。

matches部分文字列を見つけようとするだけでなく、文字列全体(この場合は末尾の改行を含む)と一致させようとすることに注意してください(これはJavaでは他の多くの言語とは異なります)。

于 2013-04-11T12:04:44.780 に答える
4

compile() を使用するときに指定する Pattern.DOTALL パラメータにより、「.」「行末ターミネータ」に一致します。match() で同じことを行うには、インライン タグを指定する必要があります。次のことを試してください。

s.matches("(?s).+name=.*successfully(?s).+")

乾杯。

于 2013-04-11T12:05:56.707 に答える