2017-04-27 59 views
1

我想通过使用正则表达式在C++中验证使用随机密码生成器函数生成的密码。正则表达式范围不能用于验证随机生成的密码

密码的规则是: 密码必须是总共8个字母。密码可以是4个大写字母和4个数字或6个大写字母和2个数字。

有效实例:

  • ABCD1234
  • PQRSTU88

我用这表达: /^(?=.{8}$)([AZ] {4,6})([0-9] {2,4})\ w +/gm

and this website测试表达式: 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

这是因为'\ w +'。你为什么使用它? –

+0

@WiktorStribiżew我是正式表达的新手,没有完全理解\ w的含义。删除它后,它是正确的。如果您已将此评论发布为答案,我会将其标记为已接受的答案。 – Ghos3t

+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总而言之)
  • ) - 交替组的端
  • $ - 端字符串。