Вы можете заменить токены, подобные этому <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
Дайте мне знать, если это то, что вы искали и работает для вас.