正则表达式范围不能用于验证随机生成的密码

时间:2017-04-27 08:02:05

标签: regex c++11

我正在尝试使用C ++中的正则表达式来验证使用随机密码生成器函数生成的密码。

密码的规则是: 密码总长度为8个字母。密码可以是4个大写字母和4个数字或6个大写字母和2个数字。

有效示例:

  • ABCD1234
  • PQRSTU88

我正在使用表达式: / ^(?= {8} $)([A-Z] {4,6})([0-9] {2,4})\ W + /克

网站来测试表达式: http://regexr.com/3frd4

当范围保持为 {1,4} 时,它会起作用,但如果我将范围更改为 {2,4} ,则第二个示例密码将失败。

单击详细信息按钮显示第一个示例密码:ABCD1234,

捕获组#1捕获ABCD&捕获组#2仅捕获123(不是1234?)。

对于第二个示例密码:PQRSTU88,

捕获组#1捕获PQRSTU&捕获组#2仅捕获8(不是88?)。

从我的理解{2,4}指定至少2个数字到最多4个数字。那么为什么我的正则表达式在第二个例子的情况下不适用于该范围。

1 个答案:

答案 0 :(得分:2)

您的第二个字符串未通过验证,因为它只包含5个字母和2个数字,但您的正则表达式后面至少需要再添加1个字符。

  

密码长度必须为8个字母。密码可以是4个大写字母和4个数字或6个大写字母和2个数字。

您需要使用

^(?:[A-Z]{4}[0-9]{4}|[A-Z]{6}[0-9]{2})$

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • (?: - 轮换组开始
    • [A-Z]{4} - 4个大写ASCII字母
    • [0-9]{4} - 4位数(总共8位)
  • | - 或
    • [A-Z]{6} - 6个大写ASCII字母
    • [0-9]{2} - 2位数(总共8位)
  • ) - 交替小组的结尾
  • $ - 字符串结束。