我需要用数字替换给定的字符串表达式。
例如:字符串1+3+5
需要替换为以下值
1 = 270.5
3 = 377.5
5 = 377.5
但它没有按预期工作。
270.5+377.377.5+377.5
270.5+377.5+377.5
注意: 我使用了字边界\b
提前致谢。
答案 0 :(得分:1)
我建议使用哈希映射来定义替换,并使用import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;
public class HelloWorld{
public static void main(String []args){
String s = "1+3+5";
Map<String, String> map = new HashMap<String, String>();
map.put("1", "270.5");
map.put("3", "377.5");
map.put("5", "377.5");
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\d+").matcher(s);
while (m.find()) {
String value = map.get(m.group());
if (value != null) {
m.appendReplacement(result, value);
} else {
m.appendReplacement(result, m.group());
}
}
m.appendTail(result);
System.out.println(result.toString());
}
}
替换为非常简单的{{1}}正则表达式(因为您的输入仅包含int值):
{{1}}
答案 1 :(得分:0)
在正则表达式中,您应该检查一个数字前面是一个点还是另一个数字,在这种情况下不要替换它。这样就可以了:
str = str.replaceAll("([^\.0-9]|^)1", "$1270.5");
str = str.replaceAll("([^\.0-9]|^)3", "$1377.5");
str = str.replaceAll("([^\.0-9]|^)5", "$1377.5");
答案 2 :(得分:0)
您可以更改替换顺序:
String s = "1+3+5";
String r = s.replaceFirst("\\b5\\b", "377.5").replaceFirst("\\b3\\b", "377.5").
replaceFirst("\\b1\\b", "270.5");
System.out.printf("%s%n", r);
//=> 270.5+377.5+377.5
另一个选择是使用负面的lookbehind声明我们没有DOT
作为前面的角色:
String r = s.replaceFirst("(?<!\\.)\\b1\\b", "270.5").
replaceFirst("(?<!\\.)\\b3\\b", "377.5").
replaceFirst("(?<!\\.)\\b5\\b", "377.5");
//=> 270.5+377.5+377.5
答案 3 :(得分:0)
你必须小心你在那里使用的正则表达式。如果您只是指定数字:
str = str.replaceAll("1", "270.5");
str = str.replaceAll("3", "377.5");
str = str.replaceAll("5", "377.5");
然后第三个电话也将取代数字&#34; 5&#34;从前一个电话的十进制数字:270。 5 和377. 5
你可以在这里使用很多正则表达式。一个例子是:
str = str.replaceAll("^1", "270.5");
str = str.replaceAll("\\+3\\+", "+377.5+");
str = str.replaceAll("\\+5$", "+377.5");
第一个电话将取代&#34; 1&#34;这是在字符串的开头; 第二个电话将取代&#34; 3&#34;那是在两个&#34; +&#34;的中间。标志; 第三个电话将取代&#34; 5&#34;这是在字符串的末尾。
您也可以使用replaceFirst
代替replaceAll
,因为每次调用只会替换1次。