1

$さて、Javaや正規表現などのサインインに関する投稿を(たくさん)読んでいます。しかし、何らかの理由で、交換しようとするたびにIndexOutOfBoundsException.

$記号で始まる文字列を整数に解析しようとしています。

私が$testそれを行うとNumberFormatException(これは私が望むものです)が$5与えられますが、私が行うと他の例外(IndexOutOfBoundsException)が与えられますが、それを変更してそれに\0024続く番号を追加しています...誰か助けてくれますか?ありがとう!

if (w.charAt(0) == '$') {
    try {
        w = w.replace("\u0024", "");
        int i = Integer.parseInt(w);
        m.appendReplacement(sb, ChatTweaks.Citrus.get("dollarIn") + "" + '\u0024' + i);
    } catch (NumberFormatException nume) {
        ChatTweaks.showMsg(ChatTweaks.prefix + "Please use numbers after your dollar signs ($)w=" + w);
        return;
    } catch (Exception ex){
        ChatTweaks.showMsg(ChatTweaks.prefix + "Unknown exception ex: " + ex + " w:" + w);
    }
}
4

3 に答える 3

2

あなたの置換コードは私にとってはうまくいきますが、なぜ正規表現を使用して最初の文字を削除するのですか? これはより簡単で、同様に機能します。

w = w.substring(w.length()-1)

また、コードを読みやすくするために、「$」と「$」で十分です。「$」は 1 バイト文字であるため、「\u002」と同等である必要があります。または、特別な要件はありますか?

http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.htmlを参照してくださいテキスト操作の問題を解決しようとしているときに思い浮かびます。

于 2013-01-28T03:22:40.213 に答える
1

\u0024ドル記号の Unicode エスケープ シーケンスです。コードはドル記号をチェックしw.charAt(0) == '$'( )、それを削除 ( w = w.replace("\u0024", "")) してから、元に戻します ( '\u0024' + i)。

編集:これが奇妙であることはわかっていましたが、実際の問題を見逃していました。わかりました。Matcher.appendReplacement は、置換に $+number シーケンスがあり、キャプチャされたグループへの参照として扱っているため、不平を言っています。

これは、appendReplacement に関する限り、エスケープ シーケンスがコンパイル時に解析されるため、何もエスケープしない\u0024ためです。実行時までに、ソースに as として書き込まれた文字列の長さは1であり、その唯一の文字はリテラルのドル記号です。(実際、Unicode エスケープ シーケンスは、行を数えた直後に、Java コンパイラによって解析されるほぼ最初のものです。たとえば、変数を宣言してから、 (または)を使用して (正規表現または文字列の外側で) コードで使用できます) 。 ."\u0024"int $foo;\u0024foo = 123;\u0024\u0066\u006f\u006f = 123;

appendReplacement のドル記号をエスケープするには、バックスラッシュでエスケープします。文字列内のエスケープ シーケンスはコンパイル時に解析されるため、バックスラッシュもエスケープする必要があります。すなわち、

m.appendReplacement(sb, ChatTweaks.Citrus.get("dollarIn") + "\\$" + i);

明確にするために、コンパイル時に、コンパイラは"\\$"長さ 2 の文字列を認識して作成します。その文字は \ と $ です。実行時に、appendReplacement はそれらを認識し、$ だけを挿入できます。

メソッドMatcher.quoteReplacementもこれを行うことができます。これは、ChatTweaks.Citrus.get("dollarIn")想定されていないドル記号を返す可能性があり、マッチャーを混乱させる可能性がある場合に備えて良い考えです。例えば、

m.appendReplacement(sb,
    Matcher.quoteReplacement(ChatTweaks.Citrus.get("dollarIn") + "$" + i));
于 2013-01-28T03:30:30.670 に答える