2014-05-12 60 views
1

^(?=(.*\d){4,})(?=(.*[A-Z]){3})(?!\s)(?=.*\W{2,})(?=(.*[a-z]){2,}).{12,14}$正則表達式(紅寶石):匹配非字,但不包括空間

上面的正則表達式是試圖:

  • 匹配至少4個數字 - (?=(.*\d){4,})
  • 嚴絲合縫3上殼體字母 - (?=(.*[A-Z]){3})
  • 與空格不匹配 - (?!\s)
  • 匹配至少2個非單詞字符 - (?=.*\W{2,})
  • 匹配至少2個低級 - (?=(.*[a-z]){2,})
  • 字符串必須在長度爲12和14之間 - .{12,14}

但是我有收到此避免匹配空間是一個挑戰。這似乎是因爲\ W還包括空格,我之前對空格的負面預測被忽略。

例如:

rubular link

編輯,以提供進一步的說明:

基本上,我試圖避免必須拼出POSIX [:punct:]類中的所有字符,即!"#$%&'()*+,./:;<=>[email protected]\^_\ {|}〜-` ..這就是爲什麼我需要使用\ W ..但是我也想排除空格

我可以使用第二雙眼睛,這裏更有經驗的建議..

再次編輯,糾正在子模式規定計數混淆,如指出,下面接受的答案。

+2

你可以添加一個應該匹配但不匹配的測試,或者一個不應該匹配的文本,但是可以嗎? –

+0

我與@UriAgassi - 它讓求職者的生活更輕鬆 – mdesantis

+0

是的,我同意..我也有信的人數混合起來。現在編輯。謝謝。 –

回答

1

而不是使用點.的,使用非空格\S

^(?=(.*\d){3,})(?=(.*[A-Z]){2})(?=.*\W{1,})(?=(.*[a-z]){1,})\S{12,14}$ 
//             here ___^^ 

這是一個錯字match at least 4 digits - (?=(.*\d){3,}), 應該是:

match at least 3 digits - (?=(.*\d){3,}) 

match at least 4 digits - (?=(.*\d){4,}) 

同爲其他計數。

+0

是的,拼寫錯誤和混淆。基本上,我針對不同的事情處理不同的模式,並將所有計數混淆在一起,但概念/想法是相同的。你的建議在最後匹配非空格當然有效。我也發現在原始模式下從'(?!\ s)'更改爲'(?!。*。*)'。 –

+0

一般來說,好像使用字符類混淆了ruby <2中的正則表達式引擎的前瞻性,例如'\ W {n}似乎在計算未知的換行符'\ n'字符串 –

+0

我仍然在努力理解,爲什麼從原始模式中的'(?\ s)'改變爲'(?!。*。*)'但是'(*!* * s。*)'不會以同樣的方式工作 –