5

そのような数値を有効にして正規表現を作成する必要があります。

 "+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123"

これらは無効です:

 "++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2".

この正規表現のさまざまなバリエーションを試しました:

 "[\\+\\-]?[1-9]{0,3}([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\.][\\d]*)?"

テスト用のコード:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class REGEX {
private static final String REGEX = "[\\+\\-]?[1-9]{0,3}([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\d]{3}[\\,]{1})?([\\.][\\d]*)?";

private static String[] validNumbers = { "+1", "1.0", "1,233",
        "1,233,456.34", "-1", ".34", "1,345,234,122,123" };

private static String[] invalidNumbers = { "++1", "1.0.0", "1,23,3",
        "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2" };

public static void main(String[] args) {
    Pattern pattern = Pattern.compile(REGEX);

    for (String number : validNumbers) {
        Matcher matcher = pattern.matcher(number);
        if (!matcher.matches()) {
            System.out.println("Valid number is detected as invalid: "
                    + number);
        }
    }
    for (String number : invalidNumbers) {
        Matcher matcher = pattern.matcher(number);
        if (matcher.matches()) {
            System.out.println("Invalid number is detected as valid: "
                    + number);
        }
    }
}

}

コンソールが空になると、タスクは完了です。今、私はそのような問題を抱えています:

有効な数が無効として検出される: 1,233

有効な数値が無効として検出される: 1,233,456.34

有効な数値が無効として検出される: 1,345,234,122,123

無効な番号が有効として検出されました: 1。

よろしく。大きいサイズでごめんなさい。

アップデート。Noob UnChainedのおかげで、次の正規表現に進みました。

^([\\+\\-]?[1-9]\\d{0,2})*(\\,\\d{3})*([\\.][\\d*])?$

そして今では問題が少なくなっています:

有効な数値が無効として検出される: 1,233,456.34

有効な番号が無効として検出される: .34

アップデート。

正規表現:

"([\\+\\-]?[1-9]\\d{0,2})*(\\,\\d{3})*([.][\\d]*)?"

問題:

無効な番号が有効として検出されました: 1。

終了した

最終結果は次のとおりです。

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

前回の更新以降の変更:([.][\d]+)?

さらに、このブロックでは、ユーザーが数字を入力してからドットを入力しても、その後に何も入力しないと、不可能な状況になります。

新しい更新:ドットの代わりにコンマやその他の記号を入力しないように、最後のブロックに 2 つの "\" を追加しました。

新しい更新: user2266098nhahtdhに感謝します。

user2266098は、未知の問題である "0.1" 数に注目し、2 番目のブロックに "|0" を追加することで解決策を示しました。しかし、彼の正規表現は、私のデータの "+" と "-" では正しく機能しません ("[]" ではなく "()" のため)。また、「*」の代わりに量指定子「{0,}」を使用するのは、そのサイズが理由で好きではありません。

nhahtdhは空の文字列の未知の問題に注意を向け、"(?!$)" で解決策を示しました。

みんなありがとう!

アップデート

この場合には、新しい条件があります。

そのような数値を有効にして正規表現を作成する必要があります。

"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"

これらは無効です:

"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"

私はまだ「完璧な」正規表現を取得できません=)

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

与えます: 無効な数値が有効として検出されました: 0,123

4

2 に答える 2

4

終了した

最終結果は次のとおりです。

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

前回の更新以降の変更:([.][\d]+)?

さらに、このブロックでは、ユーザーが数字を入力してからドットを入力しても、その後に何も入力しないと、不可能な状況になります。

新しい更新: ドットの代わりにコンマやその他の記号を入力しないように、最後のブロックに 2 つの "\" を追加しました。

新しい更新: user2266098nhahtdhに感謝します。

user2266098 は、未知の問題である "0.1" 数に注目し、2 番目のブロックに "|0" を追加することで解決策を示しました。しかし、彼の正規表現は、私のデータの "+" と "-" では正しく機能しません。また、「*」の代わりに量指定子「{0,}」を使用するのは、そのサイズが理由で好きではありません。

nhahtdh は空の文字列の未知の問題に注意を向け、"(?!$)" で解決策を示しました。

みんなありがとう!

アップデート

この場合には、新しい条件があります。

そのような数値を有効にして正規表現を作成する必要があります。

"+1", "1.0", "1,233", "1,233,456.34", "-1", ".34", "1,345,234,122,123", "0.1"

これらは無効です:

"++1", "1.0.0", "1,23,3", "+-1233456.34", "002", "1.", "a1", "1,,2", "1 2", "1,2", ",2", "", "0,123"

私はまだ「完璧な」正規表現を取得できません=)

"(?!$)[\\+-]?([1-9]\\d{0,2}|0)?(\\,\\d{3})*(\\.\\d+)?"

与えます: 無効な数値が有効として検出されました: 0,123

于 2013-04-16T16:28:53.407 に答える
3

これは、すべてのテストデータで機能します。

^(\\+|-)?([1-9]\\d{0,2}|0)?(,\\d{3}){0,}(\\.\\d+)?

ところで、0.1も一致させたいと思っていますが、正規表現は機能しません。コメントできないので、これを回答に書いています

于 2013-04-16T16:50:14.840 に答える