我想确定给定的字符串'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("<.*>", ".*"))
但是我目前不知道如何以通用且可靠的方式实现此“插槽”提取。
如果有任何建议/建议,我将不胜感激。
答案 0 :(得分:2)
您可以从第一个字符串中将<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
让我知道这是否是您想要的并为您工作。