文字列「スロットの抽出」

Euestros:

私は与えられた文字列「b」が文字列「A」のパターンと一致するかどうかを確認します。また、文字列「」文字「B」が抽出されるべき実際の値を含むが、プレースホルダ/スロットを含むことができます。

例:

String a = "Hello my name is <NAME> and I am from <CITY>"
String b = "Hello my name is Ben and I am from New York"

推測される結果:

-> b matches a
-> NAME = "Ben"
-> CITY = "New York"

次のようにaとbが一致するかどうかを確認するには、私が進んで:

b.matches(a.replaceAll("<.*>", ".*"))

しかし、私は現在、汎用的かつ堅牢な方法でこの「スロット」-extractionを実装する方法を見当もつかない。

私は、任意の勧告/ HINSに感謝することでしょう。

PushpeshクマールRajwanshi:

あなたは、このようなトークンを置き換えることができます<name>(.*)、キャプチャグループを形成した後、作成するために、あなたの最初の文字列からPatternグループ化された文字列を使用します。その後、パターンに一致する2番目の文字列を使用することができますし、それが一致した場合は、グループからデータを取得するために、すべてのグループにアクセスすることができます。

ここで私は動作するはずですし、それがさらに強固にするために、あなたの他のニーズごとに更新することができると思う最初のコードです。

public static void main(String[] args) {
    matchAndExtract("Hello my name is <NAME> and I am from <CITY>", "Hello my name is Ben and I am from New York");
}

public static void matchAndExtract(String s1, String s2) {
    List<String> placeHolderNames = new ArrayList<>();

    Pattern p1 = Pattern.compile("(?<=<)[^<>]+(?=>)");
    Matcher m1 = p1.matcher(s1);
    while (m1.find()) {
        placeHolderNames.add(m1.group());
    }

    Pattern p2 = Pattern.compile(s1.replaceAll("<.*?>", "(.*)"));
    Matcher m2 = p2.matcher(s2);
    if (m2.matches()) {
        System.out.println("Both string matches");
        for (int i = 0; i < m2.groupCount(); i++) {
            System.out.println(placeHolderNames.get(i) + " = " + m2.group(i + 1));
        }
    } else {
        System.out.println("Both string doesn't match");
    }
}

プリント、

Both string matches
NAME = Ben
CITY = New York

これはあなたが探していたものであり、あなたのために働くなら、私に教えてください。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=210806&siteId=1