0

仕事でコードのメンテナンスをしていて、この小さなスニペットに出くわしました...

public CharSequence filter(CharSequence source, int start,
                int end, Spanned dest, int dstart, int dend) {
            if (end > start) {
                String destTxt = dest.toString();
                String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend);

                try {
                    if (!resultingTxt.matches("[0123456789]*[.]?[0123456789]{0,2}")||
                            Float.parseFloat(resultingTxt)>360f) {
                        if (source instanceof Spanned) {
                            SpannableString sp = new SpannableString("");
                            return sp;
                        } else {
                            return "";
                        }

                    }
                } catch (NumberFormatException nfe) {
                    // doesn't matter.
                }
            }
            return null;
        }

今、私は正規表現の専門家ではありませんが、これはテキストボックスが空ではないかどうか、0 から 360 までの数値が含まれているかどうか、小数点以下 2 桁以下の精度であるかどうかを確認する非常に冗長な方法のように思えます。テキストが含まれていません。何か不足していますか?これは、Android EditText から出てきます。

次の部分 - テキストを強制的に数値のみにするのではなく、Double.parseDouble() または同等のものを使用するのではなく、なぜ主の名においてこれを行うのでしょうか? 正規表現はそれだけの価値があるほど高速ですか?

このコードはめちゃくちゃなので、この男が読んでいても驚かないでしょう - http://freeworld.thc.org/root/phun/unmaintain.html

4

4 に答える 4

1

次のクールな Web サイトなど、オンライン ツールでハードな正規表現を試すことができます。

http://gskinner.com/RegExr/

于 2012-07-24T20:28:21.787 に答える
1

[0123456789]*

数字。括弧は、「これらのいずれかが実行される」ことを示しています。最後の星は、任意の量 (ゼロ以上) で繰り返すことができることを示しています。

[.]?

繰り返しますが、括弧は「これらのいずれか」を示しています。削除することもできますが (オプションは 1 つしかありません)、ドット "." 括弧の外にある場合、正規表現でも意味があります。これは、「任意の文字が実行される」ことを意味します。ドットを文字として使用するには、エスケープする必要があります (おそらく "\.?")。「?」は、これが 1 回または 0 回発生する可能性があることを示しています。括弧内では、ドットはメタ文字として動作しません。

[0123456789]{0,2}

中括弧は、以前と同じパターンを何回繰り返すことができるかの範囲を示しています。{n,m} は、「少なくとも n 回繰り返すが、m 回を超えない」と読むことができます。これは、テキストに余分な桁がないことから、最大 2 つの余分な桁があることを示しています。

于 2012-07-24T20:43:42.073 に答える
0

正規表現は、入力が数値であり、空ではなく、小数点以下 2 桁以下であることを確認するだけであると想定するのは正しいことです。

いいえ、この場所で の代わりに正規表現を使用する理由はありませんDouble.parseDouble()Double.parseDouble()実際、私がまとめた簡単なテストでは、正規表現の 10,000 回の反復は、形式 (71ms)の約 5 倍 (348ms)かかりました。さらに、彼は数値の解析を呼び出して、それが であるかどうかを確認し> 360fます。なんで?知るか。

ここのコーダーは、仕事を早く終わらせようとしているか、Java をよく理解していませんでした。私の推測では後者ですが、前者であったことを願っています。

PS: 素晴らしいリンクでした。私の一日を作りました。:)

于 2012-07-24T20:29:43.527 に答える
0

正規表現 (私が確実に答えることができる唯一の部分) は、作成者が意図したことを実行しません。基本的に、文字列が任意の桁数であること、次に任意の文字の 0 または 1 桁、そして 0 ~ 2 桁の整数であることをチェックします。

有効な文字列には以下が含まれます

1234567H12
q2
&

ライターがドットを一致させることを意図していた場合、正規表現のその部分は次のようになっているはずです。

[\.]?

空の文字列にも一致します。

于 2012-07-24T20:36:00.240 に答える