Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在正则表达式中搜索字母数字密码_Regex_Regex Lookarounds - Fatal编程技术网

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

Regex 在正则表达式中搜索字母数字密码,regex,regex-lookarounds,Regex,Regex Lookarounds,我一直在尝试创建一个正则表达式,它可以检测长度在5-20个字符之间的字母数字密码。这些密码可以包含特殊字符(@$!%*?&)。我的尝试要么没有检测到所有的测试用例,要么产生了大量的误报 正则表达式当前看起来如下所示: \b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b \b(?=.[a-zA-Z])(?=..*\d*)(?=.[$!%*?&]*)[a-zA

我一直在尝试创建一个正则表达式,它可以检测长度在5-20个字符之间的字母数字密码。这些密码可以包含特殊字符(
@$!%*?&
)。我的尝试要么没有检测到所有的测试用例,要么产生了大量的误报

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

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

正则表达式的标准如下:

  • 检测长度在5到20个字符之间的混合字母数字字
  • 检测特殊符号(
    @$!%*?&
    等)
在编写原始正则表达式时,我在应用字符边界时遇到了很多问题,比如说,如果一个单词是21个字符,我根本不希望它被检测到。我基本上只想扫描这个长度之间的项目,但这个边界阻止了许多匹配被检测到

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

  • 将单词定义为任意字符(包括特殊字符)
  • 查找长度在5-20个字符之间的单词
  • 检查它们是否为字母数字(
    aA-zZ0-9!£$
    etc)
  • 仅匹配符合此条件的单词
我不确定我是否正确思考了这一点,我看了其他字母数字密码问题,答案似乎不符合我的测试用例:

谢谢你的帮助

(?:^|[^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}
,然后是字符串
$
的结尾,或者是一个不可匹配的字符
[^a-zA Z-d$!%*?*!%>


正则表达式与你不想要的东西和你所做的事情一样重要,在你的模式中,你使用这些正面的外观头
(?=.*\d*)(?=.[@$!%*.\\\\\\.&]*)
在这里,你想要断言的内容应该匹配0+倍的数字或使用asterix
*
的特殊字符

因此,如果该断言存在或不存在,则该断言将为真,这将始终为真,为您提供比预期多得多的匹配项

您可以使用锚定来断言字符串的开始
^
和结束
$
,并省略
*
以至少匹配1次以确保它在那里

(?结尾处的负查找确保左侧不是char a-zA-Z或空格。您可以通过不允许空格匹配来忽略这一点

但是强制执行此规则将不允许
rese7fwdvgfe
匹配,但在示例数据中,您确实希望匹配它,以便可以将lookback排除在模式之外

^(?=[^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次
  • $
    字符串结尾