从字符串中提取占位符

3
我有两个字符串。其中一个包含"格式"和占位符,而另一个包含占位符的实际值。
例如:
字符串1:"<username> <password>" 字符串2:"myUser myPass" 字符串1:"<name>, <familyName>" 字符串2:"John, Smith" 我尝试将变量String username分配为第二个字符串中用户名占位符的值,并将变量String password分配为第二个字符串中密码占位符的值。
我知道String.replaceAll()方法,但那只会用第二个字符串替换第一个字符串吗?

1
欢迎来到本站。即使您认为它不会产生预期的结果,也应该尝试一些东西。这将有助于其他人理解您想做什么。目前,您的解释不够清晰,无法理解您尝试做什么的具体细节。 - Sergey Kalinichenko
使用replace而不是replaceAll。对于这种替换,正则表达式太笨重且过于复杂了。 - VGR
1
欢迎来到StackOverflow。很抱歉,这不是本站的使用方式。正如[tour]中所解释的那样,本站是一个有用问题及其答案的存储库,而不是帮助论坛。请参观[tour],访问[help],特别是阅读[ask]和为什么“Can someone help me?”不是一个实际的问题?,以了解如何有效地使用本站。 - Jim Garrison
1
嗨,谢谢你。我不习惯论坛或者StackOverflow。我会查看这些链接并尝试适应这个网站的工作方式。 - Etienne Poulin
3个回答

3

处理这个问题的一个可行方法是维护一个令牌及其替换的映射。然后,您可以迭代该映射并将替换应用于文本,类似于以下内容:

String text = "There is a user <username> who has a password <password>";
Map<String, String> tokens = new HashMap<>();
tokens.put("<username>", "myUser");
tokens.put("<password>", "myPass");

for (Map.Entry<String, String> entry : tokens.entrySet()) {
    text = text.replaceAll(entry.getKey(), entry.getValue());
}

System.out.println(text);

There is a user myUser who has a password myPass

Demo


1
这个方法解决了普通的String::replaceAll方法:
String one ="<username> <password>";
String two = "<name>, <familyName>";

String username = "myUser";
String password = "myPass";
String name = "John";
String familyName = "Smith";

// will result in "myUser myPass" without the quotation marks
String outputOne = one.replaceAll("<username>", username).replaceAll("<password>", password);

// will result in "John Smith" without the quotation marks
String outputTwo = two.replaceAll("<name>", name).replaceAll("<familyName>", familyName);

0
我建议使用正则表达式来完成这个任务。首先从字符串1中捕获所有的键,然后创建相应的正则表达式,从中获取字符串2中的值。
提取键和相应值的代码:
    String keyString = "<name>, <familyName>";
    int i  = 0;
    List<String> keys = new ArrayList<>();
    Pattern pattern = Pattern.compile("<(\\w+)>");
    Matcher matcher = pattern.matcher(keyString);
    StringBuilder sb = new StringBuilder("");
    while(matcher.find()) {
            String token = matcher.group(1);
        sb.append(keyString.substring(i, matcher.start()));
        sb.append("([\\w ]+)");
        keys.add(token);
        i = matcher.end();
    }

    Pattern valuePattern = Pattern.compile(sb.toString());
    Matcher valueMatcher = valuePattern.matcher("John, Smith");
    Map<String,String> keyValueMap = new HashMap<>();
    while(valueMatcher.find()) {
        int counter = 0;
        for(String key:keys) {
            keyValueMap.put(key, valueMatcher.group(++counter));
    }
}

对于所有其他键值对同样执行。

JShell 最终输出:

jshell> keyValueMap
keyValueMap ==> {password=myPass, familyName=Smith, name=John, username=myUser}

1
听起来不错。你能详细说明一下吗?例如,展示一个完整的代码示例? - Zabuzard
据我理解,OP想在文本中找到例如<username>的占位符,然后用某个已知值替换它。你的正则表达式代码只是找到了占位符,但我没有看到任何替换发生。 - Tim Biegeleisen
@TimBiegeleisen 我认为OP想要创建一个键值对,我之前分享了一个想法,但现在我也更新了代码。 - Aman Chhabra
@Zabuza 我已经编辑了我的答案,并分享了代码片段和输出结果。希望这能帮到你。 - Aman Chhabra
为什么要点踩? - Aman Chhabra
1
投票是在编辑之前进行的。所以我猜是因为你的答案当时没有完全解决问题。那只是一个提示或评论。现在它好多了,我会给你点赞 :) - Zabuzard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接