2015-10-13 58 views
1

我正在琢磨如何編寫一個特定的正則表達式,並認爲我會來這裏尋求一點指導。RegEx:非重複模式?

我正在尋找的是,做以下的表達式:

  • 的7字符長度以上
  • 任何單個字符是四個模式之一(大寫字母,小寫字母,數字和一組特殊字符,比如#$%@)。

(現在,這裏的地方我有問題):

  • 另一個單個字符也將匹配所不同的是一個已經匹配的模式描述的模式之一。因此,如果匹配的第一個模式是大寫字母,則第二個字符匹配應該是模式中的小寫字母,數字或特殊字符。

給你舉一個例子,字符串AAAAAA#將匹配,如將字符串AAAAAAA。但是,字符串AAAAAAA,也不會字符串AAAAAA &(因爲&字符不是特殊字符模式的一部分)。

任何想法?謝謝!

+2

換句話說,你正在尋找7個或更多的字符,其中包括來自四個組中至少兩個的字符? – glibdud

+0

使用lookarounds,它很容易。 – sln

+0

@glibdud的確如此。 –

回答

1

首先,你需要做一個負前瞻,以確保整個字符串不會從一個組由字符:

(?!(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$) 

然後檢查其確實含有至少7個字符合法字符列表(沒有別的):

^[a-zA-Z0-9#$%@]{7,}$ 

結合他們(感謝Shlomo指出了這一點):

^(?!(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$)[a-zA-Z0-9#$%@]{7,}$ 
+2

你可以將這兩個結合成一個正則表達式:'^(?!^(?:[az] * | [AZ] * | [0-9] * | [#$%@] *) $)[a-zA-Z0-9#$%@] {7,} $' – Shlomo

+0

@Shlomo Heh ...很對。編輯它,謝謝! – glibdud

2

如果你只需要兩種不同類型的字符,你可以使用所有格量詞功能(在Objective C語言中):

^(?:[a-z]++|[A-Z]++|[0-9]++|[#$%@]++)[a-zA-Z0-9#$%@]+$ 

或更簡潔與原子團:

^(?>[a-z]+|[A-Z]+|[0-9]+|[#$%@]+)[a-zA-Z0-9#$%@]+$ 

由於每個分支都是帶有佔有量詞的字符類,因此您可以確定由[a-zA-Z0-9#$%@]+匹配的第一個字符來自不同的類。

關於字符串大小,請先用適當的函數單獨檢查它,如果大小太小,您將避免正則表達式檢查的成本。