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

在Java中替换字符串中的多个字符,java,Java,我有一些带方程式的字符串,格式如下:((a+b)/(c+(d*e)) 我还有一个文本文件,其中包含每个变量的名称,例如: a velocity b distance c time 等等 对于我来说,编写代码的最佳方式是什么,这样它就可以在a发生的任何地方插入velocity,在b发生的任何地方插入distance,等等?我会制作一个哈希映射,将变量名映射到描述,然后遍历字符串中的所有字符,并用其映射替换已识别键的每个出现。 我将使用StringBuilder构建新字符串。我将创建一个哈希映射,

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

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

a velocity
b distance
c time
等等


对于我来说,编写代码的最佳方式是什么,这样它就可以在
a
发生的任何地方插入
velocity
,在
b
发生的任何地方插入
distance
,等等?

我会制作一个哈希映射,将变量名映射到描述,然后遍历字符串中的所有字符,并用其映射替换已识别键的每个出现。
我将使用StringBuilder构建新字符串。

我将创建一个哈希映射,将变量名映射到描述,然后迭代字符串中的所有字符,并用其映射替换每个已识别键的出现。
我将使用StringBuilder构建新字符串。

对于字符串
str
,使用
replaceAll()
函数:

str = str.toUpperCase();  //Prevent substitutions of characters in the middle of a word
str = str.replaceAll("A", "velocity");
str = str.replaceAll("B", "distance");
//etc.

对于字符串
str
,请使用
replaceAll()
函数:

str = str.toUpperCase();  //Prevent substitutions of characters in the middle of a word
str = str.replaceAll("A", "velocity");
str = str.replaceAll("B", "distance");
//etc.

使用hashmap并按照Boschman的建议迭代字符串是一个很好的解决方案

String variable = "a";
String newVariable = "velocity";
str.replaceAll("\\b" + variable + "\\b", newVariable);
另一个解决方案是按照其他人的建议执行并执行.replaceAll();但是,您可能希望使用正则表达式指定只替换与整个变量名匹配的单词,而不替换子字符串。使用单词边界“\b”匹配的正则表达式将提供此解决方案

String variable = "a";
String newVariable = "velocity";
str.replaceAll("\\b" + variable + "\\b", newVariable);

请参见

使用hashmap并按照Boschman的建议对字符串进行迭代是一个很好的解决方案

String variable = "a";
String newVariable = "velocity";
str.replaceAll("\\b" + variable + "\\b", newVariable);
另一个解决方案是按照其他人的建议执行并执行.replaceAll();但是,您可能希望使用正则表达式指定只替换与整个变量名匹配的单词,而不替换子字符串。使用单词边界“\b”匹配的正则表达式将提供此解决方案

String variable = "a";
String newVariable = "velocity";
str.replaceAll("\\b" + variable + "\\b", newVariable);
参见

在这种情况下,不要使用
String#replaceAll
如果有微小的可能性,您将替换字符串中包含您稍后要替换的子字符串,如
“distance”
包含
a
,如果您稍后要用
“velocity”
替换
a,您将得到
“disvelocityance”

这可能是一个相同的问题,就像您想用
B
替换
A
和用
A
替换
B
一样。对于这种文本操作,您可以使用
Matcher
类中的
appendReplacement
appendTail

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);
此代码将尝试查找不属于某个单词的
a
b
c
的每一次出现(它前后没有任何字符-在表示的
\b
的帮助下完成)。
appendReplacement
是将上次匹配的文本追加到StringBuffer文本的方法(如果是第一个匹配项,则从开头开始),但将用新词替换找到的匹配项(我从映射中获取替换项)。
appendTail
将在最后一个匹配项后放入StringBuilder文本


此外,为了使此代码更具动态性,应该根据Map中使用的键自动生成regex

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();
在这种情况下不要使用
String#replaceAll
,如果您很可能会替换字符串中包含稍后要替换的子字符串的部分,例如
“distance”
包含
a
,如果您稍后要用
“velocity”
替换
a
,您将得到
disvelocityance“

这可能是一个相同的问题,就像您想用
B
替换
A
和用
A
替换
B
一样。对于这种文本操作,您可以使用
Matcher
类中的
appendReplacement
appendTail

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);
此代码将尝试查找不属于某个单词的
a
b
c
的每一次出现(它前后没有任何字符-在表示的
\b
的帮助下完成)。
appendReplacement
是将上次匹配的文本追加到StringBuffer文本的方法(如果是第一个匹配项,则从开头开始),但将用新词替换找到的匹配项(我从映射中获取替换项)。
appendTail
将在最后一个匹配项后放入StringBuilder文本


此外,为了使此代码更具动态性,应该根据Map中使用的键自动生成regex

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();

看看,这不是一种安全的方法。如果替换将包含可用于替换另一个字符的字符,该怎么办?例如,如果您更改顺序,先用距离替换
b
,然后用速度替换
a
,当然,您将得到
disvelocityance
e这将取决于原始字符串是什么。我假设替换都是小写的。这不是安全的方法。如果替换将包含可用于替换另一个字符的字符,该怎么办?例如,如果您更改顺序,首先将
b
替换为
distAnce
,然后替换
>a
使用
velocity
您将获得
disvelocityance
。当然,这将取决于原始字符串是什么。我假设替换的字符串都是小写。“\\b“模式中已有的边界匹配将只匹配精确的单词,因此replaceAll也可以工作。@bdrx不精确。
replaceAll
不是解决多重替换问题的好方法。1)它在字符串上迭代多次,2)如果OP想用
word2
更改
wor1
,用
word1
更改
word2
,该怎么办?@Pshemo对于多变量替换的情况,例如wor1=word2和word2需要用word1替换都不是一个好办法