在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替换都不是一个好办法