【问题标题】:Regular expression for without consecutive or sequential digits没有连续或连续数字的正则表达式
【发布时间】:2017-03-12 13:46:31
【问题描述】:

我想验证我的用户输入是否满足以下条件。 它应该由4-7个数字组成 它不应该有像 1111 这样的连续数字 它不应该有像 1234 这样的序列号

我们可以使用 {4,7} 应用范围 4-7,但不确定剩余条件。

您能否建议我们如何为 java 实现这一目标

【问题讨论】:

标签: java android regex


【解决方案1】:

不要使用正则表达式。

算法 >

  1. 如果输入不是数字则停止。

(尝试捕捉)

  1. 将输入 str 转换为数字和数字数组。
   str.split("");

   Integer.parseInt(str); 
  1. 使用数字检查范围 4-7。

(num>1111 && num<9999999)

  1. 使用数组来检查连续和连续的数字。
 if (numarr[i] + 1 != numarr[i + 1]) {//Not sequential}

 if (numarr[i]     != numarr[i + 1]) {//Not repeated}
  1. 打印决定。
    public class myjava {
        public static void main(String[] args) {
            String str;
            str = "12346a";
            str = "12345";
            str = "22222";
            str = "12346";
            try{
                int num = Integer.parseInt(str);
                int[] numarr= getarr(str);          
                if((num > 1111 && num < 9999999) && !issequential(numarr) && !isrepeated(numarr) ){
                    System.out.println("valid user:"+num);
                }
                else {
                    System.out.println("Invalid user:"+num);
                }
            }
            catch(java.lang.NumberFormatException e){
                System.err.println("ID is not number :"+e);
            }
        }
        private static boolean isrepeated(int[] numarr) {
            for (int i = 0; i < numarr.length - 1; i++) {
                if (numarr[i] != numarr[i + 1]) {
                    System.out.println("Not repeated");
                    return false; }
            }
            System.out.println("repeated");
            return true;
        }
        private static boolean issequential(int[] numarr) {
            for (int i = 0; i < numarr.length - 1; i++) {
                if (numarr[i] + 1 != numarr[i + 1]) {
                    System.out.println("Not sequential");
                    return false; }
            }
            System.out.println("sequential");
            return true;
        }
        private static int[] getarr(String str) {
            String[] strarr = str.split("");
            int[] intarr = new int[str.length()];
            for(int i=0;i < strarr.length;i++) intarr[i]=Integer.parseInt(strarr[i]);
            return intarr;
        }
    }

【讨论】:

    【解决方案2】:

    使用两组正则表达式。使用一个来匹配明显的东西,如 1111|2222|3333|4444|5555|6666|7777|8888|9999|0000|1234|2345|3456|4567... 并强制失败。然后做简单模式:'^[0-9]{4,7}$'

    您的问题是试图在一个正则表达式上完成所有操作。积极搜索排除项和允许的位。

    【讨论】:

    • 这里的问题是4-7位的约束。遵循这种方法将来自 1111|...|1111111 等等。可能需要一段时间才能匹配显而易见的事情
    • 默认情况下匹配 1111 将匹配 1111111。您可以在正则表达式中匹配这些内容,尽管 ^(\d)\1{3,6}$ 应该匹配任何字符并且后面跟 3-6 个字符结束。那肯定是可行的。计数位或诸如 54321 之类的东西很难,但是您可以将它们全部输入,我只关心它们。这些东西是对错误密码的判断要求之类的东西。您不妨拥有一个禁止的数字列表并搜索这些数字。问题含糊不清。
    【解决方案3】:

    应该由4-7个数字组成

    正如你提到的那样,这是微不足道的:

    ^[0-9]{4,7}$
    

    它不应该有像 1111 这样的连续数字

    这只是检查有 no 匹配:

    ([0-9])\1+
    
    • 与之前匹配的组 ([0-9]) 匹配相同的文本超过 1 次(从两个数字的重复项开始)。如果您有更具体的重复标准,只需像第一种情况一样使用括号。

    它不应该有像 1234 这样的连续数字

    我相信几乎所有正则表达式引擎都不会在匹配的实际符号内执行数字比较。更多信息here。我会尝试使用除正则表达式之外的其他东西,例如从第二个元素开始的简单 for 循环,比较前一个元素是否是当前元素加一。 O(n)

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多