2

次の形式を検証する Java (java.util.regex) で使用する有効な正規表現を取得しようとしています。

最大 15 桁の数値。そのうち 3 桁までは小数で、先頭に区切り文字 (,) が付きます。

したがって、有効なのは次のとおりです。

123456789012345  (15 digits, ok)
12345678901234,1

[編集]、これらも有効である必要があります:

1234567890123,45
123456789012,345 

これまでのところ、次の正規表現パターンを思いつきました:

Pattern = [0-9]{1,15}(\,[0-9]{1,3})?

これは、1 ~ 15 桁の範囲をチェックし、その後にオプションの区切り文字が続き、さらに 3 桁が続きます。ただし、これは入力の全長をチェックしません。この正規表現では、123456789012345,123 の値が有効です。

したがって、合計の長さをチェックする式を追加し、「(?=」構造を使用して論理 AND 動作をシミュレートすると考えました。

そこで、次のように既存の正規表現にそれを追加することから始めました。

Pattern = (?= [0-9]{1,15}(\,[0-9]{1,3})?)

ただし、これにより、基本的に私が投げたすべてが失敗し、それ以上機能しなくなります。ここで何が間違っているのかわかりませんか?これが機能した後、合計の長さを確認する別の式を追加します (?=.{16}) のようなものだと思います。

4

4 に答える 4

1

[編集] がある場合は合計 16 の長さを受け入れたいと思いました,。また、ここでは 2 つのケースしかないため、実際にはルックアラウンドを使用する必要がないことに気付きました。これはうまくいきます:

public static boolean isValid(String input) {
    return input.matches("^(\\d{0,15}|\\d{1,12},\\d{1,3})$");
}

これは、これらのいずれかが true の場合に有効を返します

  • 入力は 0 ~ 15 の数字または
  • 入力は 1 ~ 12 の数字で構成され、その後に,、その後に 1 ~ 3 の数字が続きます

[編集2]

わかりました、新しい試み:

public static boolean isValid(String input) {
    return input.matches("^(\\d{0,15}|(?=.{3,16})\\d+,\\d{1,3})$");
}

これは、これらのいずれかが true の場合に有効を返します

  • 入力は 0 ~ 15 の数字または
  • 入力は 3 ~ 16 文字で構成され、少なくとも 1 つの数字、その後,に続く 、1 ~ 3つの数字で構成されます
于 2012-07-13T09:55:07.920 に答える
0

この正規表現を試してください:

^\d{1,12}(?:\d{0,3}|\d{0,2},\d|\d{0,1},\d\d|,\d\d\d)$
于 2012-07-13T15:49:20.830 に答える
0

これは私のために働いた。

    boolean a = Pattern.matches("\\d{15}|\\d{12},\\d{3}", "123456789012345");
    System.out.println(a);//true
    boolean b = Pattern.matches("\\d{15}|\\d{12},\\d{3}", "123456789012,345");
    System.out.println(b);//true
    boolean c = Pattern.matches("\\d{15}|\\d{12},\\d{3}", "1234567890123,456");
    System.out.println(c);//false

したがって、正規表現は次のとおりです。

\d{15}|\d{12},\d{3}
于 2012-07-13T09:46:29.197 に答える
0

これはどうですか?RegExrで再生する

\d{12,15},?\d{3}
于 2012-07-13T09:37:04.660 に答える