java RE class - lookahead(实现密码验证器)

时间:2016-05-01 15:28:35

标签: java regex apache

我试图召唤一个正则表达式来验证给定的密码是否包含: 1.大写字母 2.小​​写字符 一个数字 4.至少8个字符

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

localhost/index.php?url=localhost/index.php/whatever_came_after

不幸的是,我只局限于使用java的org.apache.regexp.RE类的遗留系统。

没有预见,我能够将规则1-3定义为以下正则表达式:

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

但我不知道如何在不使用“?=”元字符的情况下将length参数添加到此字符串。

尝试编译“(?= ...)”失败,出现以下错误:

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

我的问题: RE类中存在“前瞻”吗? 如果没有,我如何在RE类regex中实现“AND”运算符?

谢谢!

1 个答案:

答案 0 :(得分:0)

您列出的第二个表达式仅测试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

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