Строка "Слот-Добыча" - PullRequest
       14

Строка "Слот-Добыча"

3 голосов
/ 22 марта 2019

Я хочу выяснить, соответствует ли данная строка 'b' шаблону строки 'a'.Кроме того, строка «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("<.*>", ".*"))

Но в настоящее время я понятия не имею, как реализовать это «слот-извлечение» универсальным и надежным способом..

Буду благодарен за любые рекомендации / подсказки.

1 Ответ

2 голосов
/ 22 марта 2019

Вы можете заменить токены, подобные этому <name>, на (.*) из первой строки, чтобы сформировать группы захвата, а затем создать Pattern, используя сгруппированную строку.Затем вы можете использовать вторую строку для сопоставления с шаблоном, а если она совпадает, то вы можете получить доступ ко всем группам для извлечения данных из групп.

Вот исходный код, который, я думаю, должен работать и может быть обновлен.в соответствии с вашими другими потребностями, чтобы сделать его еще более надежным.

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

Дайте мне знать, если это то, что вы искали и работает для вас.

...