字符串replaceAll具有带double的特定数值

时间:2016-12-02 11:26:34

标签: java regex replaceall

我需要用数字替换给定的字符串表达式。

例如:字符串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

提前致谢。

4 个答案:

答案 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次。