用户登录必须仅包含拉丁文和俄文字母,数字0-9以及某些符号(如点和其他)。我想使用正则表达式进行检查,并尝试了不同的变体,但没有人工作。
errors["error-name"] = '';
var nameRegex = '[a-zA-Z0-9А-Яа-я.+~_-!?*]/i';
if(!values['name'].match(nameRegex)) {
errors["error-name"] += "Incorrect login<br>";
}
怎么了?
答案 0 :(得分:1)
要匹配所有俄语字母,仅[А-Яа-я]
范围是不够的。您还需要将字母[ёЁ]
添加到范围内,因为它不在该范围内。
此外,字符类中文字符号之间的未转义连字符会创建一个范围,最好放在字符类的开头或结尾。
要添加之类的限制,必须至少有N个,您需要使用锚定前瞻。
var nameRegex = /^(?=[^A-ZА-ЯЁ]*[A-ZА-ЯЁ])(?=[^0-9]*[0-9])[-A-Z0-9А-ЯЁ.+~_!?*]+$/i;
这是its demo
此处,^
将模式锚定在字符串的开头,$
将其锚定在最后,(?=[^A-ZА-ЯЁ]*[A-ZА-ЯЁ])
至少需要一个字母,(?=[^0-9]*[0-9])
需要至少一位数。
注意我删除了所有小写字母,因为有一个不区分大小写的修饰符/i
。
要仅匹配列表中的符号,请使用普通+
量词:
var nameRegex = /^[-A-Z0-9А-ЯЁ.+~_!?*]+$/i;
^
如果您允许空字符串,请使用*
代替+
。
答案 1 :(得分:1)
您可以使用正则表达式 lookaheads -
/^(?=.*\d)(?=.*[\wА-Яа-я.+~\-!?*]).+$/
在上面的正则表达式中,首先预测(?=.*\d)
检查数字,下一个预测(?=.*[\wА-Яа-я.+~\-!?*])
检查ASCII和俄语字符集以及特殊字符。
如果您想添加最小密码长度(例如8),您可以这样做 - /^(?=.*\d)(?=.*[\wА-Яа-я.+~\-!?*]).{8,}$/
注意:为了匹配俄语字母,我使用了您在问题中使用的范围。如果没有完成,请更改第二个前瞻中的范围。