-4

这段代码有什么问题?

public int convert(String param){
    System.out.println(param); // OUTPUT1 
    if(param=="NUM1"){
      return 10;
    }else if(param=="NUM2"){
      return 20;
    }else
      return 0;
    }
    return param;
}

String Formula="[NUM1]+[NUM2]";
Formula = Formula.replaceAll("\\[(.*?)\\]", convert("$1") );
System.out.println(Formula); // OUTPUT2 

//OUTPUT1 - $1
//OUTPUT2 - 0+0

我希望 OUTPUT1 为(NUM1 或 NUM2),而 OUTPUT2 为“10+20”。

4

2 回答 2

7

在 Java 中,不能仅用于"$1"引用匹配表达式的部分,如脚本语言。而是使用捕获组。

您应该从阅读Pattern的 javadoc 开始。

不是最好的事情:

String line = "[NUM1]+[NUM2]";
Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher(line);
while(m.find()) {
    String token = m.group(1);
    String newValue = convert(token);
    line = line.replaceAll(token, newValue);
}
于 2012-07-12T18:43:56.993 回答
1

Java 不是一种函数式语言(然而,v8 可能会更改添加它们)。看起来您要做的是将回调函数传递给replaceAll,但这在Java中不起作用。

您需要做的不是使用replaceAll,而是使用匹配器并获取所有令牌,然后遍历它们并在每个令牌上调用convert(),将其添加回字符串中。它要麻烦得多,但如果您想自己构建它,这是唯一的方法。

于 2012-07-12T18:43:36.447 回答