2010-01-04 36 views
7

Tôi đang tìm một regex khá cụ thể và tôi gần như có nó nhưng không hoàn toàn.Regex cho mật khẩu yêu cầu một số hoặc một ký tự không phải chữ và số

Tôi muốn có một regex mà sẽ cần ít nhất 5 charactors, nơi có ít nhất một trong những nhân vật là hoặc một giá trị số hoặc một nhân vật nonalphanumeric.

Đây là những gì tôi có cho đến nay:

^(?=.*[\d]|[[email protected]#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$ 

Vì vậy, vấn đề là "hay" phần. Nó sẽ cho phép các giá trị không phải là chữ và số, nhưng vẫn yêu cầu ít nhất một giá trị số. Bạn có thể thấy rằng tôi có toán tử hoặc "|" giữa tôi yêu cầu số và không phải chữ số, nhưng điều đó dường như không hoạt động.

Mọi đề xuất sẽ tuyệt vời.

+0

cho một nhân vật không tự chữ và số, bạn có thể sử dụng \ W (phi từ nhân vật, tức là không ai trong số [a-zA-Z0-9_ ]) thay vì [! @ # $% \^*() _ \ - + = \ [{\]} ;: | \ ./] –

Trả lời

19

Hãy thử:

^(?=.*(\d|\W)).{5,20}$ 

Một giải thích ngắn gọn:

^       # match the beginning of the input 
(?=      # start positive look ahead 
    .*      # match any character except line breaks and repeat it zero or more times 
    (      # start capture group 1 
    \d     #  match a digit: [0-9] 
    |      #  OR 
    \W     #  match a non-word character: [^\w] 
)      # end capture group 1 
)       # end positive look ahead 
.{5,20}     # match any character except line breaks and repeat it between 5 and 20 times 
$       # match the end of the input 
+0

đừng sợ ... điều đó không yêu cầu bạn phải có một số hoặc ký tự không phải chữ và số –

+0

Có. Tôi đoán bạn đã không kiểm tra nó đúng cách?Giao diện phía trước yêu cầu chuỗi chứa ít nhất một chữ số hoặc không phải từ. –

+2

... và nếu bạn có nghĩa là * "một số ** và ** ký tự không phải chữ và số" * thay vào đó, thì điều này sẽ thực hiện thủ thuật: '^ (? =. * \ D) (? =. * \ W) . {5,20} $ ' –

0

Làm thế nào về điều này?

^.*?[\[email protected]#$%\^*()_\-+=\[{\]};:|\./].*$ 

Đối với chiều dài 5,20 Vui lòng sử dụng strlen chức năng bình thường

+0

Điều đó không thực sự hoạt động, như thể bạn muốn không phải là chữ số hoặc chữ số ký tự số ở đầu hoặc cuối, nó sẽ thất bại. Tuy nhiên, bạn đã giúp tôi đi đúng hướng. –

+0

Bạn đã thực sự thử nghiệm chưa? Nó cũng hoạt động với ký tự không phải chữ số hoặc chữ số ở đầu hoặc cuối. – YOU

0

Là nó thực sự cần thiết để nhét tất cả mọi thứ trong một regex khổng lồ? Chỉ cần sử dụng logic chương trình (5 ≤ length(s) ≤ 20) ∧ (/[[:digit:]]/ ∨ /[^[:alpha:]]/). Dễ hiểu hơn về cú pháp và ngữ nghĩa, tôi nghĩ vậy.

+0

Tôi đang sử dụng ASP.NET thành viên trên tất cả các nơi, sẽ cần phải quay trở lại và thực hiện logic đó ở nhiều nơi cùng với ngoại lệ vv Nó dễ dàng hơn để sử dụng Regex trong cấu hình thành viên. Regex có vị trí giống như tất cả các kỹ thuật lập trình khác. –

1

Có lẽ điều này có thể làm việc cho bạn:

^.*[\d\W]+.*$ 

Và sử dụng một số mã như thế này để kiểm tra kích thước chuỗi:

if(str.len >= 5 && str.len =< 20 && regex.ismatch(str, "^.*[\d\W]+.*$")) { ... } 
+0

Tôi cần tất cả trong một regex cho vấn đề hiện tại của tôi. –

0

giải pháp Khá đơn giản, một khi S.Mark đã cho tôi đi đúng hướng , chỉ cần hợp nhất các phần số và không phải chữ và số của tôi thành một.

Đây là regex thức cho bất cứ ai đó là quan tâm:

^(?=.*[\[email protected]#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$ 

này sẽ cho phép bất kỳ mật khẩu từ 5 đến 20 ký tự và đòi hỏi ít nhất một bức thư và một số và/hoặc một nhân vật phi tự chữ và số.

Các vấn đề liên quan