具有特定数值的字符串 replaceAll

String replaceAll with specific numeric values with a double

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

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

提前致谢。

在您的正则表达式中,您应该检查一个数字前面是一个点还是另一个数字,在这种情况下不要替换它。这将做到:

str = str.replaceAll("([^\.0-9]|^)1", "70.5");
str = str.replaceAll("([^\.0-9]|^)3", "77.5");
str = str.replaceAll("([^\.0-9]|^)5", "77.5");

您可以更改替换顺序:

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

另一种选择是使用负向回顾来断言我们没有 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

你必须小心你在那里使用的正则表达式。如果您只是简单地指定数字:

str = str.replaceAll("1", "270.5");
str = str.replaceAll("3", "377.5");
str = str.replaceAll("5", "377.5");

然后第三次调用也将替换上次调用的十进制数中的数字“5”:270.5和377.5

您可以在此处使用大量正则表达式。一个例子是:

str = str.replaceAll("^1", "270.5");
str = str.replaceAll("\+3\+", "+377.5+");
str = str.replaceAll("\+5$", "+377.5");

第一次调用将替换字符串开头的“1”; 第二次调用将替换两个“+”号中间的“3”; 第三次调用将替换字符串末尾的“5”。

您也可以使用 replaceFirst 而不是 replaceAll,因为每次调用只会替换 1 次。

我建议使用哈希映射来定义替换,并使用非常简单的 \d+ 正则表达式替换 Matcher#appendReplacement(因为您的输入仅包含 int 值):

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