簡體   English   中英

如何檢查字符串是否包含小寫字母,大寫字母,特殊字符和數字?

[英]How to check whether a string contains lowercase letter, uppercase letter, special character and digit?

我一直在谷歌搜索,我沒有找到我的問題的答案:

如何檢查正則表達式字符串是否包含以下每個中的至少一個:

  • 大寫字母
  • 小寫字母
  • 數字
  • 特殊字符: ~`!@#$%^&*()-_=+\\|[{]};:'",<.>/?

所以,我至少需要一個大寫字母至少一個小寫字母至少一個數字至少一個特殊字符。

我確定答案很簡單,但我找不到。 任何幫助是極大的贊賞。

對於需要滿足所有條件的測試,正則表達式不是很好。

因此,最簡單的答案是不要試圖同時測試它們,而只是依次嘗試四個類中的每一個。

您的代碼可能是分數慢,但它會更容易閱讀和維護,如

public boolean isLegalPassword(String pass) {

     if (!pass.matches(".*[A-Z].*")) return false;

     if (!pass.matches(".*[a-z].*")) return false;

     if (!pass.matches(".*\\d.*")) return false;

     if (!pass.matches(".*[~!.......].*")) return false;

     return true;
}

編輯固定引號 - 一直在做太多該死的JS編程......

我同意@ Alnitak的答案是最容易閱讀的,但是它每次運行時都必須評估正則表達式。 由於正則表達式是固定的,因此編譯它們然后與它們進行比較是有意義的。 例如:

    private static final Pattern [] passwordRegexes = new Pattern[4];
    {
        passwordRegexes[0] = Pattern.compile(".*[A-Z].*");
        passwordRegexes[1] = Pattern.compile(".*[a-z].*");
        passwordRegexes[2] = Pattern.compile(".*\\d.*");
        passwordRegexes[3] = Pattern.compile(".*[~!].*");
    }
    public boolean isLegalPassword(String pass) {

        for(int i = 0; i < passwordRegexes.length; i++){
            if(!passwordRegexes[i].matcher(pass).matches())
                return false;
        }
        return true;
    }

當使用10個字符的密碼運行100,000次時,上述代碼的速度是原來的兩倍。 雖然,我想現在你可以說這段代碼更難讀! 沒關系!

這可以在java中作為單個正則表達式執行,但我個人會使用類似Mark Rhodes提供的解決方案。 隨着規則變得更加復雜,這將很快變得荒謬(如果還沒有......)。

String regex = "^(?=.*?\\p{Lu})(?=.*?[\\p{L}&&[^\\p{Lu}]])(?=.*?\\d)" + 
               "(?=.*?[`~!@#$%^&*()\\-_=+\\\\\\|\\[{\\]};:'\",<.>/?]).*$"
  1. ^這匹配字符串的開頭。 這不是必須的,但我發現它有助於提高可讀性和理解力。 此外,使用它時,您通常可以大幅提升性能,幾乎不會受到懲罰。

  2. (?= X )這被稱為正向前瞻。 基本上我們所說的是“字符串的開頭(^)必須跟着這個東西X才能匹配,但是不要將光標前進到X的末尾,保持在行的開頭。(那就是“向前看”部分。)

  3. 。*?\\ p {Lu}在行開頭后吃字符,直到找到大寫字母。 如果沒有找到大寫字母,這將無法匹配。 我們使用\\ p {Lu}代替AZ,因為我們不希望來自世界其他地方的人舉手投訴我們的軟件是如何由一個無知的美國人寫的。

  4. 現在我們回到行的開頭(我們回去因為我們使用了前瞻)並開始搜索。*?[\\ p {L} && [^ \\ p {Lu}]]簡寫為“所有字母,減去首都“(因此匹配小寫)。

  5. 。*?\\ d +。*?[`〜!@#$%^&*()\\ -_ = + \\\\\\ | \\ [{\\]};:'\\“,<。> /?]重復用於數字和特殊字符列表。

  6. 。* $匹配其他所有內容,直到行尾。 我們這樣做只是因為java中'matches'方法的語義,看看整個字符串是否與正則表達式匹配。 您可以離開這部分並使用Matcher#find()方法並獲得相同的結果。

  7. 貓頭鷹是有史以來最好的書籍之一。 而且閱讀時間短而快。 我不能推薦它。

因為這些不會以任何特定順序出現,所以每個必需的字符類都需要前瞻斷言:

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~!@#$%\^&*()\-_=+\|\[{\]};:'",<.>/?])

(注意:因為反斜杠,插入符號,連字符和方括號在一個范圍內可能是特殊的,如果它們出現在范圍內,它們應該反斜杠轉義,如第四個先行斷言所示。)

如果您的正則表達式變體支持x修飾符,則可以使用空格和注釋使此構造更具可讀性。 java.util.regex ,您可以:

(?x)         # extended syntax
(?=.*[A-Z])  # look ahead for at least one upper case
(?=.*[a-z])  # look ahead for at least one lower case
(?=.*[0-9])  # look ahead for at least one numeral
(?=.*[~!@#$%\^&*()\-_=+\|\[{\]};:'",<.>/?])
             # look ahead for at least one of the listed symbols

你正在尋找角色類

  • 大信:[AZ]
  • 小寫字母:[az]
  • 數字:[0-9]或\\ d
  • 特殊字符:[^ A-Za-z0-9](也就是說,不是其他任何一個,其中^否定了這個類)

如果要測試“this”或“that”,可以組合這些范圍。 例如,大字母或小字母將是[A-Za-z]

\\w :用於匹配字母數字(字母可以大或小)
\\W :用於匹配特殊字符

我認為這個RegEx對您有所幫助:

[\w|\W]+

這是一個很好的RegEx模擬器 ,您可以使用它來構建自己的RegEx。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM