簡體   English   中英

檢查字符串是否至少包含以下各項之一:小寫字母、大寫字母、數字和特殊字符

[英]Check if string contains at least one of each: lowercase letter, uppercase letter, number, and special character

我已經搜索過 SO 和 Google,我發現的大多數示例似乎都沒有按預期工作(或者沒有結合所有這些元素)。 我正在嘗試創建一個 Regex 表達式,該表達式匹配(通過)如果字符串字符串中的任何位置至少包含以下一項,並且如果缺少其中任何一項則失敗:

  • 長度至少為 8 個字符
  • 大寫字母
  • 小寫字符
  • 數字
  • 特殊字符(包括句點、下划線等,即不推薦使用白名單方法 - 允許任何非字母數字字符)

這是我嘗試過的:

if (System.Text.RegularExpressions.Regex.IsMatch(txtTest.Text.Trim(), "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?^[a-zA-Z0-9_@.-]).{8,}$"))
{
    lblMsg.Text = "Pass";
}
else
{
    lblMsg.Text = "Fail";
}

問題是這沒有按預期工作。 當它們應該失敗時的以下通過(它們沒有特殊字符):

  • 123牛仔
  • 猴牛123

它似乎可以很好地檢測除特殊字符之外的所有字符。 我做錯了什么,我該如何解決?

使用以下更改(?=.*?^[a-zA-Z0-9_@.-])

       + see here
(?=.*?[^a-zA-Z0-9_@.-])
                 ^^ i kept the dot, hyphen, etc as you used, if you don't need, remove.

在這個正則表達式中,字符類[]^否定字符。 你快到了,只是不幸的是你把它放在[]之外

雖然有很多方法可以給這只貓剝皮,但我更喜歡將這些代碼包裝到可重用的擴展方法中,這樣以后的工作就變得微不足道了。 使用擴展方法時,您還可以避免使用 RegEx,因為它比直接字符檢查慢。 我喜歡使用 Extensions.cs NuGet 包中的擴展。 它使這項檢查變得如此簡單:

  1. https://www.nuget.org/packages/Extensions.cs包添加到您的項目中。
  2. 將“ using Extensions; ”添加到代碼的頂部。
  3. "Smith23@".IsStrong()將返回 True 而"Smith23".IsStrong()將返回 False。
  4. 其余代碼中的所有其他檢查都只是MyString.IsStrong() 默認情況下.IsStrong()驗證所有 4 個組件都用於強字符串,但如果您只想使用 4 個組件中的 3 個,您可以像這樣MyString.IsStrong(3)那樣做。

您的示例代碼將變得如此簡單:

using Extensions;

//if (System.Text.RegularExpressions.Regex.IsMatch(txtTest.Text.Trim(), "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?^[a-zA-Z0-9_@.-]).{8,}$"))
if (txtTest.Text.Trim().IsStrong())
{
    lblMsg.Text = "Pass";
}
else
{
    lblMsg.Text = "Fail";
}

暫無
暫無

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

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