【问题标题】:How to use regex for verifying multiple conditions in JAVA?如何使用正则表达式验证 JAVA 中的多个条件?
【发布时间】:2020-08-10 18:31:46
【问题描述】:

我有一个字符串作为输入,它具有以下多个要通过的条件。

它是一个长度为 8 的字符串,包含所有数字。要求是 如果以下 4 个条件中的任何一个为真,则该方法应返回 false。

First two characters -  13, 24, 28

characters three and four - 55, 99

characters five and six - 20, 21 

last two characters - 42, 38, 09, 17, 66

如何使用正则表达式验证这一点,而不是拆分为 4 个字符串并检查。

提前致谢。

【问题讨论】:

  • 是否清除字符串所有数字

标签: java regex string unit-testing


【解决方案1】:

根据您的问题,字符串是否由数字组成,不清楚。如果字符串由所有数字组成,那么试试这个::
(^(13|24|28)\\d{6}$)|(^\\d{2}(55|99)\\d{4}$)|(^\\d{4}(20|21)\\d{2}$)|(^\\d{6}(42|38|09|17|66)$)

String text = "12345678";
        if (text.matches("(^(13|24|28)\\d{6}$)|(^\\d{2}(55|99)\\d{4}$)|(^\\d{4}(20|21)\\d{2}$)|(^\\d{6}(42|38|09|17|66)$)")) {
            System.out.println("Inalid");
        } else if(text.matches("^\\d{8}$")){
            System.out.println("Valid");
        } else {
            System.out.println("Invalid");
        }

说明:

  • ^(13|24|28)\d{6}$) -- 匹配前两位数 && \d{6} 表示下一个 6 字符是任何数字..

  • (^\d{2}(55|99)\d{4}$) -- \d{2} 表示前两位任意数字 && 匹配 带条件的第 3 和第 4 位数字..\d{4} 表示最后 4 个字符是任意的 数字..

Demo 在这里检查匹配或不匹配...

【讨论】:

  • 不做题的要求,例如问题并没有说字符串都是数字。
  • @Andreas 他说的是 8 个字母串...并且他匹配每对 2 位数字。它的共同所有数字。如果不是,那么 \\d 将被替换为 .
  • 如果您想将“8 字母字符串”解释为“8 位字符串”,您可以,但是您必须在答案中这么说,因为这是一个假设 你在做。
  • @Golam 我的情况无论如何都是针对所有数字的。谢谢。
  • @Thinker 那么这个答案适合你吗?
【解决方案2】:

一种方法是使用匹配组,因此(a|b) 将匹配ab

所以你的正则表达式会像

^((13|24|28).{6}|.{2}(55|99).{4}|.{4}(20|21).{2}|.{6}(42|38|09|17|66))$

您可以在 java 中使用 PatternMatcher 类。

if (value.length() != 8) {
    return false;
} else {
    String patternString = "^((13|24|28).{6}|.{2}(55|99.).{4}|.{4}(20|21).{2}|.{6}(42|38|09|17|66))$";

    Pattern pattern = Pattern.compile(patternString);

    Matcher matcher = pattern.matcher(value);
    boolean matches = matcher.matches();

    return !matches;
}

关于字符串的长度,我看不到在正则表达式中检查它的好方法。因此,只需使用 if-else 语句检查即可。

但如果您需要多次,请确保只编译一次模式。

对于创建正则表达式,我建议使用regex101regexr 之类的网站。

【讨论】:

  • 不做题的要求。再次阅读问题:"It is 8 letter String and the method should return false if any of the following 4 conditions is 真".
  • @Andreas 是的,对此感到抱歉。已更正。
  • 请停止讽刺! :P
  • @Ackdari 模式中的 {6} {2} {4}|.{4} .{6}) 是什么?
  • @Thinker 我举个例子a{6} 将匹配六个as 和. 匹配除换行符之外的任何字符,因此.{6} 将匹配一行中的六个字符
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多