具有特定数值的字符串 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());
}
}
我需要用数字替换给定的字符串表达式。
例如:字符串 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());
}
}