12

Java が C# の名前付きパターン マッチングに相当するものを持っているかどうか疑問に思っていました。たとえば、C# では次のようなことができます。

var pattern = @";(?<foo>\d{6});(?<bar>\d{6});";
var regex = new Regex(pattern , RegexOptions.None);
var match = regex.Match(";123456;123456;");

var foo = match.Groups["foo"].Success ? match.Groups["foo"].Value : null;
var bar = match.Groups["bar"].Success ? match.Groups["bar"].Value : null;

これは、グループを取得するためのクリーンな方法のように思えます。Java で同様のことを行うことはできますか? または、インデックスの位置に基づいてグループを取得する必要がありますか?

String foo = matcher.group(0);
4

3 に答える 3

19

これはJava 7以降でサポートされています。C# コードは次のように変換できます。

String pattern = ";(?<foo>\\d{6});(?<bar>\\d{6});";
Pattern regex = Pattern.compile(pattern);
Matcher matcher = regex.matcher(";123456;123456;");
boolean success = matcher.find();

String foo = success ? matcher.group("foo") : null;
String bar = success ? matcher.group("bar") : null;

Matcherを呼び出すまで正規表現テストを実際に実行しないオブジェクトを作成する必要がありますfind()

(メソッドfind()のように、入力文字列のどこでも一致を見つけることができるため、使用しましたRegex.Match().matches()メソッドは、正規表現が入力文字列全体と一致する場合にのみ true を返します。)

于 2012-06-22T17:25:32.687 に答える
2

Java v1.7 は Perl 標準の名前付きグループ like(?<name>...)および\k<name>in パターンをサポートするようになりました。

同じパターン内にグループ名を重複させることはできません。これは、制御できない小さな断片から大きなパターンを構築している非常に複雑なケースでは煩わしい場合があります。また、相対インデックスもありません。

ただし、あなたが書いているように見えるような単純なものには十分なはずです。

于 2012-06-22T17:27:20.503 に答える
-2

インポートが必要だと思います

org.apache.commons.lang3.StringUtils;

このため

 private Boolean validateEmail(String email)
    {
        return email.matches("^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\\.[a-zA-Z](-?[a-zA-Z0-9])*)+$");
    }

    private Boolean validateIP(String IP)
    {
        return IP.matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
    }

    private Boolean validateHostname(String Hostname)
    {
        return Hostname.matches("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$");
    }
于 2012-06-22T17:23:30.360 に答える