我有一些方程式字符串,格式如下((a+b)/(c+(d*e)))
。
我还有一个文本文件,其中包含每个变量的名称,例如:
a velocity
b distance
c time
等...
编写代码的最佳方式是什么,以便在velocity
到处发生a
distance
,b
为{{1}},依此类推? / p>
答案 0 :(得分:4)
在这种情况下不要使用String#replaceAll
如果有一点点机会你将替换你的字符串包含你想要在以后替换的子字符串,例如"distance"
包含a
和if您希望稍后将a
替换为"velocity"
,最后将使用"disvelocityance"
。
如果您希望将A
替换为B
,将B
替换为A
,则可能会出现同样的问题。对于此类文本操作,您可以使用appendReplacement
类中的appendTail
和Matcher
。这是示例
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)))
此代码会尝试查找a
或b
或c
的每一个匹配项,这些字段不属于某个单词(它之前或之后没有任何字符 - 在代表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();
答案 1 :(得分:2)
我将hashMap映射到变量名称到描述,然后遍历字符串中的所有字符,并用它的映射替换已识别键的每个出现。 我会使用StringBuilder来构建新的字符串。
答案 2 :(得分:0)
使用散列图并按照Boschman的建议迭代字符串是一个很好的解决方案。
另一种解决方案是做其他人建议的做并做一个.replaceAll();但是,您可能希望使用正则表达式来指定仅替换匹配整个变量名而不是子字符串的单词。使用字边界'\ b'匹配的正则表达式将提供此解决方案。
String variable = "a";
String newVariable = "velocity";
str.replaceAll("\\b" + variable + "\\b", newVariable);
请参阅http://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
答案 3 :(得分:-2)
对于字符串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.