2014-01-30 36 views
1

我工作的一些遺留代碼,發現了一個正則表達式,並希望有人能對它進行解剖我:大廈密碼驗證的正則表達式動態

((?=.*[^a-zA-Z])(?=.*[a-z])(?=.*[A-Z]).{8,}) 

我知道它在做什麼,但不能完全肯定它是如何做它。什麼是「。」在條件之後做什麼?

我想添加一些代碼來動態生成這個正則表達式。也就是說,如果一組配置表示密碼可以做任何事情,我想返回一個正則表達式,它將在groovy中爲所有.CallSchema()函數返回true。到目前爲止,我剛剛完成了字符串格式設置,所以創建的正則表達式是「(。)」,但是當使用matches()調用時返回false。

感謝您的幫助!

+0

'.'會匹配1個不是換行符的字符。如果你想允許任何數量的這些字符(包括空字符串),那麼你需要'。*',一個或多個'。+',正好是x'。{x}',在x和y之間'。{x ,y}',至少x'。{x,}'或者至多x'。{,x}'。我建議訪問rexegg.com(在下面的答案中鏈接)並瀏覽那裏的信息;聽起來好像你會回到這裏很多,如果你沒有得到正則表達式的基本句柄。 – adamdc78

回答

0

這將檢查以確保密碼包含非字母字符,至少包含一個小寫字母大寫字母字符,最後整個字符串的長度至少爲8個字符。後一部分是.進來的地方 - 匹配整個字符串並確保8個字符以上。

1

下面是爲您分解的解釋和幾個示例字符串。

http://regex101.com/r/oZ6dK4

的TL;博士在這裏,使用向前斷言,它要求在字符串中的至少某處你有:

  • 小寫字母[a-z]
  • 大寫字母[A-Z]
  • a非字母[^a-zA-Z]
  • 而且它必須至少爲8字符{8,}

這看起來像一個密碼要求驗證對我來說。

字符串,它將匹配:

asdfsdklj2-3049-09AS 
09809LK2JL23Lsdf 

字符串它不會匹配:

asdfsdf 
2398-02934 
23Abs 

至於你提到的點(.)問題:它不是一個時期,這是一個正則表達式特殊與換行符以外的任何字符匹配。 (在regex101解釋中,你可以看到它聲明.{8,} matches any character (except newline))。在這種情況下,原因~"(.)".matches()返回false,是因爲它需要至少8個字符才能驗證。

+0

感謝您的回覆,我收到了很多。爲什麼這段時間會在正則表達式中出現?爲什麼〜「(。)」。matches()會爲所有字符串返回false? –

+0

這不是一個句點,它是一個正則表達式特殊字符,它匹配除了換行符之外的任何字符。在這種情況下,它失敗的原因是因爲它至少需要8個字符才能驗證。 – brandonscript

+0

我根據一些配置更改正則表達式。說正則表達式變成(。),那麼這個失敗了。這裏沒有長度限制。你知道爲什麼這會失敗嗎? –

0

(?=.*[^a-zA-Z) - 此檢查是否存在一個非字母字符中的某處密碼

(?=.*[a-z]) - 此檢查是否存在在密碼小寫字符某處

(?=.*[A-Z]) - 此檢查是否存在大寫字母在密碼的某處

.{8,} - 這將檢查是否至少有8個字符。

?=是積極的向前看。此括號內的正則表達式必須匹配,並且必須在輸入中的該點之後發生。

檢查rexegg.com爲各種有用的正則表達式信息和一個非常有用的快速參考。

+0

哦,好的,謝謝!所以 。是第十一部分?假設沒有長度約束,'((?=。* [^ a-zA-Z])(?=。* [a-z])(?=。* [A-Z]))'還有其他限制嗎? –

+0

'.'匹配除換行符之外的任何字符; 「{8,}」的意思是「8次或更多次」,它被應用於'.'。你仍然需要用'。+'代替'。{8,}','+'代表1次或更多次,相當於'{1,}'。 – adamdc78