首页 > 解决方案 > 如何使用正则表达式验证连续的数字序列?

问题描述

我需要为 PIN 验证编写一个正则表达式。

PIN 为 4 位数字,不得包含连续数字。

连续数字的例子:

[ 1111, 1234, 9876, 8888, 0987, 0123 ]

我试过这个链接,但它只检查相同的数字,而不是连续的数字。

你能建议为我工作正则表达式吗?

标签: javaregex

解决方案


正则表达式仅匹配

这就是为什么像这样的正则表达式(调整为 4 位数字):

^(\\d)(?!\\1+$)\\d{3}$

,显示在链接“this”(链接找到的问题)中只会检查相同的数字。

注意:原来的表达式稍微小了一点,所以更容易理解——没有量词。在表达式 '(?<!\1)\d' 中,"\1 -> group(1)" 匹配前面没有 "group(1)" 的 "\d -> a didgit",使用否定后向查找。它不匹配相等的数字。

我们希望在正则表达式中直接使用算术运算符,将其应用于“group(1)”,以便仅使用正则表达式来解决它,但正则表达式不支持。

这是一个替代方案,而不是正则表达式,首先是核心代码片段:

int digit = Integer.parseInt(String.valueOf(pin.charAt(i)));
int nextDigit = Integer.parseInt(String.valueOf(pin.charAt(i + 1)));
if (digit >= nextDigit - 1 && digit <= nextDigit + 1) {
    resultMap.put(pin, false);
    break;
}

上下文和“testbench”中的代码片段:

public static void main(String[] args) {
    List<String> inputs =
            Arrays.asList("1111", "1234", "9876"
                    , "8888", "0987", "0123"
                    , "1358", "0268", "9635");

    Map<String, Boolean> resultMap = new LinkedHashMap<>();
    for (String pin : inputs) {
        for (int i = 0; i < pin.length() - 1; i++) {
            resultMap.put(pin, true);
            int digit = Integer.parseInt(String.valueOf(pin.charAt(i)));
            int nextDigit = Integer.parseInt(String.valueOf(pin.charAt(i + 1)));
            if (digit >= nextDigit - 1 && digit <= nextDigit + 1) {
                resultMap.put(pin, false);
                break;
            }
        }
    }

    System.out.println(resultMap);
}

输出:

{1111=false, 1234=false, 9876=false, 8888=false, 0987=false, 0123=false, 1358=true, 0268=true, 9635=true}

推荐阅读