gpt4 book ai didi

java - 在Java中替换字符串中的多个字符

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:02 25 4
gpt4 key购买 nike

我有一些带有以下格式的方程的字符串((a+b)/(c+(d*e)))

我还有一个文本文件,其中包含每个变量的名称,例如:

a velocity
b distance
c time

等等...

对我来说,编写代码的最佳方式是什么,以便在出现 a 的地方插入 velocity,并在出现 b 时插入 distance,等等?

最佳答案

在这种情况下,如果您替换字符串的部分有可能包含稍后要替换的子字符串,请不要使用 String#replaceAll,例如 "distance" 包含 a,如果您稍后想用 "velocity" 替换 a,您最终会得到 "disvelocityance"

这可能与您想要将 A 替换为 B 并将 B 替换为 A 产生同样的问题。对于这种类型的文本操作,您可以使用 Matcher 类中的 appendReplacementappendTail 。这是示例

String input = "((a+b)/(c+(d*e)))";

Map<String, String> replacementsMap = new HashMap<>();
replacementsMap.put("a", "velocity");
replacementsMap.put("b", "distance");
replacementsMap.put("c", "time");

StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("\\b(a|b|c)\\b");
Matcher m = p.matcher(input);
while (m.find())
m.appendReplacement(sb, replacementsMap.get(m.group()));
m.appendTail(sb);

System.out.println(sb);

输出:

((velocity+distance)/(time+(d*e)))

此代码将尝试查找不属于某个单词的 abc 的每次出现(它之前或之后没有任何字符 - 在代表 word boundaries\b 的帮助下完成)。 appendReplacement 是一种方法,它将从最后一个匹配(如果是第一个匹配,则从开头)附加到 StringBuffer 文本,但会用新单词替换找到的匹配(我从 Map 中获取替换)。 appendTail 将在最后一次匹配后将文本放入 StringBuilder 中。

<小时/>

此外,为了使此代码更加动态,应根据 Map 中使用的键自动生成正则表达式。您可以使用此代码来做到这一点

StringBuilder regexBuilder = new StringBuilder("\\b(");
for (String word:replacementsMap.keySet())
regexBuilder.append(Pattern.quote(word)).append('|');
regexBuilder.deleteCharAt(regexBuilder.length()-1);//lets remove last "|"
regexBuilder.append(")\\b");
String regex = regexBuilder.toString();

关于java - 在Java中替换字符串中的多个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40049638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com