java - 如何使用正则表达式验证连续的数字序列?
问题描述
我需要为 PIN 验证编写一个正则表达式。
PIN 为 4 位数字,不得包含连续数字。
连续数字的例子:
[ 1111, 1234, 9876, 8888, 0987, 0123 ]
我试过这个链接,但它只检查相同的数字,而不是连续的数字。
你能建议为我工作正则表达式吗?
解决方案
正则表达式仅匹配
这就是为什么像这样的正则表达式(调整为 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}
推荐阅读
- amazon-web-services - aws ecs 服务安全
- clojurescript - 如何在重新框架应用程序的 js 目录上添加影子 cljs 观察程序?
- javascript - owl carousel(2.3) 到达最后一张幻灯片时触发事件
- java - 改造如何在 GET 之外传递位置
- ios - 此项目中未启用 Fastlane Apple 通用版本控制
- google-maps - Google Places Autocomplete 有时在 Xamarin Android 项目中不起作用
- flutter - 将小部件动画回手势结束时的原始位置
- swift - 将图像从设备上传到 Firebase
- php - 如何计算数组中具有非空对应值的数字键?
- python-3.x - UnicodeDecodeError:charmap'编解码器无法解码位置 756 中的字节 0x8f