1

これが私がやったことです:

    while (sc.hasNext()) {
        String sLine = sc.nextLine();
        sLine.replaceAll("\\s", "");
        String[] scanned = sLine.split("");

私の入力は次のようになります。

IF (2 -2 +) (3 2 *) (-1 4 +) (5 3 *)

これが何を意味するかは関係ありませんが、スキャナが行うことは、まず第一に、それを「そのまま」文字列に格納することです。次に、replaceAll 関数を使用してすべての空白を削除します。その後、次のものが残ります。

IF(2-2+)(32*)(-14+)(53*)

次に、java を使用してこのコードを解釈し、エラーが発生しなければ計算を実行します。私の問題は、文字列をトークンに分割すると、各「マイナス」に独自のトークンが署名されることですが、トークンが単なる整数になるように、それに続く整数と何らかの形で関連付けたいと考えています(現在は負です) ) であり、マイナス記号が含まれるトークンはありません。そのようなことを行う簡単な方法はありますか?

4

3 に答える 3

2

:-を前に付けずnegative look-behindに分割するために使用できます。empty stringhyphen

str.split("(?<!-)");

-これはとの間の空の文字列で分割されない2ため、そのまま保持されます。

String str = "IF(2-2+)(32*)(-14+)(53*)";
String[] arr = str.split("(?<!-)");
System.out.println(Arrays.toString(arr));

出力: -

[, I, F, (, 2, -2, +, ), (, 3, 2, *, ), (, -1, 4, +, ), (, 5, 3, *, )]

これで、別の要素として持つ代わりに-2andができました。-1-

于 2013-01-30T06:24:27.010 に答える
1

文字列を "" で分割しています。あなたがやりたいと思うのは、正規表現を使用して、必要に応じて文字列を分割することです。Java 正規表現に慣れていない場合は、これを参照して理解してください。特別な構成 (非キャプチャ) セクションを見下ろすことをお勧めします。

ヒント

String[] scanned = sLine.split("your regex");
于 2013-01-30T06:28:07.057 に答える
0

この仕事には間違ったツールを使用しています。スキャナーと別のパーサーが必要です。単項マイナスは、スキャナーではなく、パーサーによって処理されます。再帰的降下式パーサー、ダイクストラ シャンティング ヤード アルゴリズムなどを調べてみてください。

于 2013-01-30T07:29:27.570 に答える