java - 使用 String.replaceAll 函数匹配正则表达式并从 Java 中的映射中获取替换值

标签 java regex str-replace

我正在尝试解析一个表达式以找出一些保留的运算符/字符串,并将它们替换为存储在 HashMap 中的相应数值,并显示具有数值而不是保留字符串的结果表达式。这就是我正在尝试做的事情:

String expression = "SUM_ALL(4:5,5:6)>MAX(6:7)";
Map<String, Double> functionOperators = new HashMap<String,Double>();
functionOperators.put("SUM_ALL(4:5,5:6)", 4.0);
functionOperators.put("MAX(6:7)",5.0);

expression = expression.replaceAll("(SUM_ALL|MAX)\\s*\\(\\s*([\\d:,]+)\\s*\\)",
            Double.toString(functionOperators.get(String.format("%s(%s)","$1","$2"))));
System.out.println(expression);

“$1”和“$2”用于反向引用表达式中的组。

这是相同的输出:

Exception in thread "main" java.lang.NullPointerException

而当我删除获取部分(从 HashMap 中)并将其限制为仅使用反向引用组进行字符串更改时,它工作得很好。

expression = expression.replaceAll("(SUM_ALL|MAX)\\s*\\(\\s*([\\d:,]+)\\s*\\)",
            String.format("%s|%s|","$1","$2"));

输出:

SUM_ALL|4:5,5:6|>MAX|6:7|

我怀疑在从 HashMap 中获取值时,“$1”和“$2”变量仍未通过反向引用得到解析,因此无法找到与相同变量相对应的键。

如果这是真的,那么您建议采用什么方法来实现我需要来自预定义 HashMap 的替换值的用例。

最佳答案

我不知道你有多少数据,但问题似乎是replaceAll无法正常工作,因为我尝试过replace并且它工作得很棒。

String expression = "SUM_ALL(4:5,5:6)>MAX(6:7)<SUM_ALL(4:5,5:6)";
String mat = "";
Map<String, Double> functionOperators = new HashMap<String,Double>();
functionOperators.put("SUM_ALL(4:5,5:6)", 4.0);
functionOperators.put("MAX(6:7)",5.0);
Matcher m = 
    Pattern.compile(
            "(?:(SUM_ALL|MAX|MIN)\\(((?:\\d+:\\d+,?){1,2})\\)[+-><\\*/]?)")
            .matcher(expression);
while (m.find()) {
    mat = String.format("%s(%s)", m.group(1), m.group(2));
    expression = expression.replace(mat, functionOperators.get(mat).toString());
}
System.out.println(expression);

直接取自您之前的示例(昨天)

关于java - 使用 String.replaceAll 函数匹配正则表达式并从 Java 中的映射中获取替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13086783/

相关文章:

php - 如何使用 Php 删除查询字符串 URL 中的空字节?

java - OriginalDestination 可以用作死信队列使用者的选择器吗?

java - 自定义 ListView 未完全显示(从底部裁剪)

java - FastSineTransformer - 用零填充数组以适应长度

java - 标记单例抽象并将方法声明为私有(private)

java - 分割逗号分隔的字符串并提取特定值

java - 正则表达式中的否定

Razor 线替换

javascript - 如何选择并运行这个onload函数?

xml - 在 C# 中从 XML 中删除所有属性的最简单方法是什么?