首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String "Slot-Extraction“

String "Slot-Extraction“
EN

Stack Overflow用户
提问于 2019-03-22 21:44:36
回答 1查看 31关注 0票数 3

我想知道给定的字符串'b‘是否与字符串'a’的模式匹配。此外,字符串'a‘可能包含占位符/槽,而字符串'b’包含应该提取的实际值。

示例:

代码语言:javascript
复制
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"

预期结果:

代码语言:javascript
复制
-> b matches a
-> NAME = "Ben"
-> CITY = "New York"

为了确定a和b是否匹配,我执行以下操作:

代码语言:javascript
复制
b.matches(a.replaceAll("<.*>", ".*"))

但我目前还不知道如何以通用和健壮的方式实现这个“槽”-extraction。

如果您有任何建议/建议,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 22:10:42

您可以使用第一个字符串中的(.*)替换像这样的<name>标记,以形成捕获组,然后使用分组的字符串创建一个Pattern。然后,您可以使用第二个字符串来匹配模式,如果匹配,则可以访问所有组以从组中检索数据。

这里是我认为应该可以工作的初始代码,并且可以根据您的其他需求进行更新,以使其更加健壮。

代码语言:javascript
复制
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");
    }
}

指纹,

代码语言:javascript
复制
Both string matches
NAME = Ben
CITY = New York

如果这就是你想要的并且对你有效,请让我知道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55300980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档