2011-01-08 76 views
10

我需要的正則表達式來驗證串.NET正則表達式具有最小長度6,它是含有至少一個非字母數字字符e.g:"eN%{S$u)""h9YI!>4j""{9YI!;4j""eN%{S$usdf)""dfh9YI!>4j""ghffg{9YI!;4j"其中檢查長度和非字母數字字符

這個工作正常^.*(?=.{6,})(?=.*\\d).*$"但在字符串不包含任何數字的情況下(例如"eN%{S$u)")它不起作用。

回答

10
^(?=.{6})(.*[^0-9a-zA-Z].*)$ 

我們使用積極的lookahead來確保至少有6個字符。然後我們匹配查找至少一個非字母數字字符([^0-9a-zA-Z])的模式。該.*的匹配任意數量的圍繞這一非字母數字字符的任意字符,但我們已經檢查我們在這裏達成的時間,我們會等額至少6

^.*(?=.{6,})(?=.*\\d).*$" 

是你試過的正則表達式。以下是一些建議:

  • 您不需要在超前視圖中匹配超過6個字符。這裏只匹配6,不會限制匹配多於6的正則表達式的其餘部分。
  • \d匹配一個數字,(?=.*\\d)是其中之一的前瞻。這就是爲什麼你遇到你提到的問題,如eN%{S$u)
  • 即使上面的點沒有錯誤,並且這裏的正則表達式是正確的,也可以將第二個前視圖與僅使用.*\\d.*.*組合起來。
1

保持容易。

// long enough and contains something not digit or a-z 
x.Length >= 6 && Regex.IsMatch(x, @"[^\da-zA-Z]") 

快樂編碼。

編輯,純粹的「正則表達式」:

這第一人稱有很多先行任何6個字母,然後確保前瞻中有一些東西是不是甲型數字(它會「扔掉」到最初的5個字符試圖匹配)。

(?=.{6}).{0,5}[^\da-zA-Z] 
+0

我保持配置文件中的正則表達式,我不能這樣做。 – Reg 2011-01-08 07:12:49

+0

此輸入失敗:`lucero-1` – Lucero 2011-01-08 10:49:18

3

marcog的答案是相當不錯的,但我周圍做其他的方式,以便更容易增加更多的條件(如具有至少一個數字或其他),我會使用懶惰量詞因爲他們是特定的模式更便宜:

^(?=.*?[^0-9a-zA-Z]).{6} 

所以,如果你要添加提到的附加條件,這將是這樣的:

^(?=.*?[^0-9a-zA-Z])(?=.*?[0-9]).{6} 

正如你所看到的,這種模式很容易擴展。請注意,它僅用於檢查匹配項,它的捕獲無用。

相關問題