2016-01-22 10 views
1

用戶登錄名只能包含拉丁和俄文字母,數字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個俄文字母。此外,領先的正則表達式分隔符不存在。嘗試'var nameRegex ='/ [ - A-Z0-9А-ЯЁ。+〜_!?*]/i';' –

+0

@WiktorStribiżew在這種情況下,登錄即使它只包含拉丁字母也是不正確的 – Heidel

+0

因此,你有什麼要求?你沒有說過必須至少有1個拉丁字母和至少1個俄文字母。 –

回答

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; 
            ^

,使用*代替+

要僅從列表匹配的符號,使用普通的量詞+

+0

注意該演示包含一個修改過的正則表達式,僅用於演示目的(因爲輸入是多行)。 –

+0

那麼,我剛剛嘗試過'var nameRegex ='/^[ - A-Z0-9А-ЯЁ。+〜_!?*] + $/i';'但在這種情況下,檢查失敗。 – Heidel

+0

[它允許'admin'檢查](https://regex101.com/r/hR7qM8/2)。它是JavaScript嗎?如果是的話,你必須刪除'''s。 –

1

您可以使用正則表達式向前看符號 -

/^(?=.*\d)(?=.*[\wА-Яа-я.+~\-!?*]).+$/

在上述正則表達式,第一先行(?=.*\d)檢查數字和未來前瞻(?=.*[\wА-Яа-я.+~\-!?*])檢查ASCII和俄羅斯字符集和特殊字符。

如果你想添加一個最小密碼長度(好比說8),你可以這樣做 - /^(?=.*\d)(?=.*[\wА-Яа-я.+~\-!?*]).{8,}$/

注意:匹配俄文字母我用你已經在你的問題中使用的範圍。如果沒有完成,則更改第二個預測範圍。

+0

這不符合所有俄文字母。 –

+0

@ - WiktorStribiżew也許吧。我不懂俄語。我使用了@海德爾在問題中使用的範圍。 –

+0

其實Ёё是非常罕見的字母,我不認爲有人會在他們的登錄中使用它,但都可能發生。 – Heidel