javaRE类前瞻(实现密码验证器)



我正在尝试变一个正则表达式来验证给定密码是否包含:1.大写字符2.小写字符3.数字4.至少8个字符长的

我找到了以下正则表达式来定义这些约束:

RE r = new RE("^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d$@$!%*#?&]{8,}$");

不幸的是,我被限制在使用java的org.apache.regexp.RE类的遗留系统中。

在没有前瞻性的情况下,我能够将规则1-3定义为以下正则表达式:

RE r = new RE("^(((.*([A-Z]+).*([0-9]+).*|.*([0-9]+).*([A-Z]+)).*)$)")

但是如果不使用"?="元字符,我不知道如何将长度参数添加到这个字符串中。

尝试编译"(?=…)"失败,出现以下错误:

org.apache.regexp.RESyntaxException: Syntax error: Missing operand to closure
    at org.apache.regexp.RECompiler.syntaxError(Unknown Source)
    at org.apache.regexp.RECompiler.terminal(Unknown Source)
    at org.apache.regexp.RECompiler.closure(Unknown Source)
    at org.apache.regexp.RECompiler.branch(Unknown Source)
    at org.apache.regexp.RECompiler.expr(Unknown Source)
    at org.apache.regexp.RECompiler.terminal(Unknown Source)
    at org.apache.regexp.RECompiler.closure(Unknown Source)
    at org.apache.regexp.RECompiler.branch(Unknown Source)
    at org.apache.regexp.RECompiler.expr(Unknown Source)
    at org.apache.regexp.RECompiler.compile(Unknown Source)
    at org.apache.regexp.RE.<init>(Unknown Source)
    at org.apache.regexp.RE.<init>(Unknown Source)
    at com.idit.hscx.passwordTest.testPassword(passwordTest.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我的问题:RE类中是否存在"前瞻性"?如果没有,如何在RE类regex中实现"AND"运算符?

谢谢!

您列出的第二个表达式只测试4个条件中的2个。它只查找大写和数字。

我能想出几种方法来做到这一点。

首先,有六种不同的大写、小写和数字组合。

  • ULN
  • UNL
  • LUN
  • LNU
  • NLU
  • NUL

计划A

使用两个正则表达式。第一个表达式将验证字符串中每种字符类型至少有一种。它有点长,因为它寻找六种组合中的每一种。

^.*?(?:[A-Z]+.*?[a-z]+.*?[0-9]|[A-Z]+.*?[0-9]+.*?[a-z]|[a-z]+.*?[A-Z]+.*?[0-9]|[a-z]+.*?[0-9]+.*?[A-Z]|[0-9]+.*?[a-z]+.*?[A-Z]|[0-9]+.*?[A-Z]+.*?[a-z])

第二个测试可以是正则表达式或字符串长度测试。正则表达式看起来像:

^.{8,}

方案B

将构建一个更复杂的正则表达式,测试每个位置的大写、小写和数字的所有不同组合。这个正则表达式自然是巨大的。

最新更新