0

まずは下のコードを見てください

public static void main(String args[])
   {
     System.out.println(new Stringtest().test("The system has saved your payment under        transaction number \369825655."));
    }

private String test(String aa)
    {
        return aa.substring(58);
    }

論理的には、このメソッドは 369825665 を出力するはずですが、そのバックスラッシュのために 9825655 を出力しています。今、私は整数が欲しいです。私は何をすべきか。テキストが Web サイトからのものであるため、\ を \\ に変更できません。

4

3 に答える 3

5

\エスケープ文字です。エスケープ文字をエスケープする必要があります。

System.out.println(new Stringtest().test("The system has saved your payment under transaction number \\369825655."));

エスケープ シーケンスの詳細については、この Oracle ドキュメントを参照してください。本質的に、バックスラッシュは、その後の文字が特別な方法で (単純なテキストとしてではなく) 解釈されるべきであることをシステムに伝えます。エスケープをエスケープすると、特別に扱われます...エスケープ文字としてではなく、プレーンテキストとして。

混乱することもありますが、核となる概念を理解すれば直感的に理解できます。

編集: String のフォーマットを制御できない場合は、運が悪い可能性があります。私はこれを Eclipse でデバッグしてきましたが、それを使用して文字列を作成するとすぐに、エスケープ文字が処理され、トランザクション番号の最初の 2 桁が失われるようです。データベース担当者 (またはこのひどい文字列をフォーマットした人) に実装を変更してもらい、必要なことを行う必要がある場合があります。Eclipse デバッガーは、少なくともこれを示唆しています。

どうやら、正常に\36処理され、表示されない別の ASCII 文字として解釈されることがあります。しかし、それ以外の場合、無効なエスケープ シーケンスとして Exception がスローされる可能性があります。

私自身のテストでは、文字列リテラルが宣言/作成されるとすぐに、情報の損失が発生するようです。したがって、私の知る限り、それを回復する方法はありません。

デバッグのスクリーンショット デバッグ情報

于 2012-09-21T15:23:45.960 に答える
1

試してください\\369825655- 基本的にエスケープ記号をエスケープします。\次に、すべての文字を空の文字に置き換えます。

于 2012-09-21T15:23:42.963 に答える
1

別のバックスラッシュを追加 (エスケープ文字)

ArrayList System.out.println(new Stringtest().test("The system has saved your payment under        transaction number \\369825655."));
于 2012-09-21T15:24:02.857 に答える