在正则表达式中搜索字母数字密码

时间:2019-06-10 13:16:28

标签: regex regex-lookarounds

我一直在尝试创建一个Regex,它可以检测长度在5到20个字符之间的字母数字密码。这些密码可以包含特殊字符(@$!%*#?&£)。我的尝试无法检测到我所有的测试用例,或者它们会生成大量的误报。

正则表达式当前如下所示:

\b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b

Here is my Regex running on Regexr with my test cases

正则表达式的标准如下:

  • 检测长度在5到20个字符之间的混合字母数字单词
  • 检测特殊符号(@$!%*#?&£等)

在编写原始正则表达式时,我遇到了很多问题,无法应用字符边界,比如说一个单词是21个字符,我根本就不想检测到它。我基本上只想扫描此长度之间的项目,但是此边界已阻止检测到许多匹配项。

采用字符串“ Rese7”和“ Rese7A”。 第一个字符串与&&匹配,第二个不匹配,我怀疑这是因为我实现了字符检查的方式。我基本上希望正则表达式执行以下操作:

  • 将单词定义为任何字符(包括特殊字符)
  • 寻找长度在5到20个字符之间的单词
  • 检查它们是否为字母数字(aA-zZ0-9!£$等)
  • 仅匹配符合此条件的单词

我不确定是否正在考虑这项权利,我查看了其他字母数字密码问题,但答案似乎并不满足我的测试用例:

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在模式中,您可以使用这些肯定的前行(?=.*\d*)(?=.*[@$!%*#?&£]*),其中要声明的内容应与数字0+倍匹配,或使用星号*匹配特殊字符。

因此,断言无论是否存在都将是正确的,这将永远为您提供比您期望更多的匹配项。

您可以使用锚点来声明字符串的开头^和结尾$,并忽略*至少匹配1次以确保它在那里。

(?<![a-zA-Z ])末尾的否定性确保左侧不是char a-zA-Z或空格。您可以通过不允许空格匹配来忽略它。

但是强制执行此规则将不允许rese7FwDdvgfe进行匹配,但是在您的示例数据中,您确实希望对其进行匹配,因此您可以将后视保留在模式之外。

^(?=[^a-zA-Z\s]*[a-zA-Z])(?=(?:[^\d\s]*\d|[^\s@$!%*#?&£]*[@$!%*#?&£]))[@$!%*#?&£a-zA-Z\d]{5,20}$

说明

  • ^字符串的开头
  • (?=[^a-zA-Z\s]*[a-zA-Z])断言大写或小写a-z
  • (?=积极前瞻
    • (?:非捕获组
      • [^\d\s]*\d声明数字
      • |
      • [^\s@$!%*#?&£]*[@$!%*#?&£]声明特殊字符
    • )关闭非捕获组
  • )积极回望
  • [@$!%*#?&£a-zA-Z\d]{5,20}匹配所有允许的5-20次
  • $字符串结尾

Regex demo

答案 1 :(得分:0)

(?:^|[^a-zA-Z\d@$!%*#?&£])[a-zA-Z\d@$!%*#?&£]{5,20}(?:$|[^a-zA-Z\d@$!%*#?&£])

您需要的是字符串^的开头,或者不是您的可匹配字符[^a-zA-Z\d@$!%*#?&£]之一,然后是5至20个可匹配字符[a-zA-Z\d@$!%*#?&£]{5,20},然后是字符串{{ 1}}或一个不可匹配的字符$

正则表达式与您不想要的东西一样重要