【问题标题】:regex can't get special constructs (?=x) to work正则表达式无法使特殊构造 (?=x) 工作
【发布时间】:2012-07-13 09:20:01
【问题描述】:

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

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

所以,有效的应该是:

123456789012345  (15 digits, ok)
12345678901234,1

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

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}) 之类的。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    [编辑] 意识到如果有,,您想接受总长度为 16,而且您实际上不需要在这里使用环视,因为您只有两种情况。这工作得很好:

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

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

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

    [EDIT2]

    好的,新的尝试:

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

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

    • 输入由0-15个数字组成
    • 输入由 3-16 个字符组成,至少包含一个数字,后跟 ,,后跟 1-3 个数字

    【讨论】:

    • 由我编辑:似乎我的描述不够具体。我添加了一些可能有效的示例。 “问题”是可能少于 3 个数字,在这种情况下,数字之前的数字可能超过 12 个字符。
    【解决方案2】:

    这个呢?在RegExr上播放它

    \d{12,15},?\d{3}
    

    【讨论】:

      【解决方案3】:

      这对我有用。

          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}
      

      【讨论】:

        【解决方案4】:

        试试这个正则表达式:

        ^\d{1,12}(?:\d{0,3}|\d{0,2},\d|\d{0,1},\d\d|,\d\d\d)$
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多