そのような数値を有効にして正規表現を作成する必要があります。
"+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 つの "\" を追加しました。
新しい更新: user2266098とnhahtdhに感謝します。
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