-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 を使用する代わりに、Matcher を使用してすべてのトークンを取得し、それらをループして各トークンで convert() を呼び出し、それを文字列に追加することです。それはもっと面倒ですが、自分で構築したい場合は、それが唯一の方法です.

于 2012-07-12T18:43:36.447 に答える