例一:
要求:
1.密码长度最少8位
2.大写字母,小写字母,数字,特殊符号必须四选三
首先给出全部四种的匹配表达式:[a-zA-Z0-9\W_]{8,}
其中\W
匹配任意不是字母,数字,下划线,汉字的字符。
然后使用排除法,排除其中只选一种或只选两种的情况,剩下的就是选了三种的情况了。
有:
大写+小写,大写+数字,大写+特殊符号,小写+数字,小写+特殊符号,数字+特殊符号。共这6种组合。
最后使用环视-正向否定匹配 (?!...)
组合起来,就得到最终需要的表达式:^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$
例二:
要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间。
分开来注释一下:
^ 匹配一行的开头位置
(?![0-9]+$) 预测该位置后面不全是数字
(?![a-zA-Z]+$) 预测该位置后面不全是字母
[0-9A-Za-z] {8,16} 由8-16位数字或这字母组成
$ 匹配行结尾位置
注:(?!xxxx) 是正则表达式的负向零宽断言一种形式,标识预该位置后不是xxxx字符。
附:
要求:可以包含数字、字母、下划线,并且要同时含有数字和字母,且长度要在8-16位之间。
^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z_]{8,16}$
Qt来判断正则表达式的类(QRegExp):
例:
ui->lineEdit_2->setText(strRegisterCode);
// QRegExp regxPsw("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z_]{8,10}$");
QRegExp regxPsw("^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$");
QString pwd = ui->lineEdit->text();
if(regxPsw.exactMatch(pwd)){ QMessageBox::warning(this,"提示","mimazhengque"); }else { QMessageBox::warning(this,"提示","mimacuowu"); }