2

我正在尝试获取一个有效的正则表达式以在验证以下格式的 java (java.util.regex) 中使用:

最多 15 位数字,其中 3 位 MAX 位可能是十进制,前面有分隔符 (,)

所以,有效的是:

123456789012345  (15 digits, ok)
12345678901234,1

[编辑],这些也应该是有效的:

1234567890123,45
123456789012,345 

到目前为止,我想出了以下正则表达式模式:

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

这将检查 1 到 15 位数字的范围,后跟可选的分隔符,后跟另外 3 位数字。但是,这不会检查输入的总长度。使用此正则表达式,值 123456789012345,123 将是有效的。

所以,我想我会添加一个额外的表达式来检查总长度,并使用 "(?=" 构造来模拟逻辑与行为。

所以我开始将它添加到我现有的正则表达式中,如下所示:

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

然而,这基本上导致我扔给它的所有东西都失败了,我无法让它进一步工作。我不明白我在这里做错了什么?在这工作之后,我会添加另一个表达式来检查总长度,我认为类似于 (?=.{16}) 。

4

4 回答 4

1

[编辑]意识到 如果有 a ,你想接受总长度 16 ,,而且你真的不需要在这里使用环视,因为你只有两个案例。这工作得很好:

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

如果其中之一为真,则返回有效

  • 输入由 0-15 个数字组成
  • 输入由 1-12 个数字组成,后跟 a ,,然后是 1-3 个数字

[编辑2]

好的,新的尝试:

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

如果其中之一为真,则返回有效

  • 输入由 0-15 个数字组成
  • 输入由 3-16 个字符组成,至少包含一个数字,后跟 a ,,后跟 1-3 个数字
于 2012-07-13T09:55:07.920 回答
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 回答
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 回答