用于检查用户登录的正则表达式不起作用

时间:2016-01-22 18:39:20

标签: javascript regex

用户登录必须仅包含拉丁文和俄文字母,数字0-9以及某些符号(如点和其他)。我想使用正则表达式进行检查,并尝试了不同的变体,但没有人工作。

errors["error-name"] = '';
var nameRegex = '[a-zA-Z0-9А-Яа-я.+~_-!?*]/i';

if(!values['name'].match(nameRegex)) {
      errors["error-name"] += "Incorrect login<br>";
    }

怎么了?

2 个答案:

答案 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,}$/

注意:为了匹配俄语字母,我使用了您在问题中使用的范围。如果没有完成,请更改第二个前瞻中的范围。