2011-01-08 36 views
10

tôi cần biểu thức chính quy để xác nhận chuỗi có độ dài tối thiểu 6 và nó được chứa ít nhất một nhân vật phi tự chữ và số ví dụ: "eN%{S$u)", "h9YI!>4j", "{9YI!;4j", "eN%{S$usdf)", "dfh9YI!>4j", "ghffg{9YI!;4j".NET biểu hiện thường xuyên mà kiểm tra độ dài và các ký tự không tự chữ và số

Chế độ này hoạt động tốt ^.*(?=.{6,})(?=.*\\d).*$" nhưng trong trường hợp chuỗi không chứa bất kỳ số nào (ví dụ: "eN%{S$u)"), nó không hoạt động.

Trả lời

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

Chúng tôi sử dụng lookahead tích cực để đảm bảo có ít nhất 6 ký tự. Sau đó, chúng tôi kết hợp mẫu tìm kiếm ít nhất một ký tự không phải chữ và số ([^0-9a-zA-Z]). Các .* 's phù hợp với bất kỳ số lượng của bất kỳ nhân vật xung quanh một nhân vật phi tự chữ và số này, nhưng do thời gian chúng tôi đã đạt đến ở đây chúng tôi đã kiểm tra mà chúng tôi phù hợp với ít nhất là 6.

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

là regex bạn đã thử. Dưới đây là một số đề xuất:

  • Bạn không cần khớp nhiều hơn 6 ký tự trong bảng chú giải. Chỉ khớp với 6 ở đây không hạn chế phần còn lại của cụm từ thông dụng so khớp hơn 6.
  • \d khớp với một chữ số và (?=.*\\d) là một điều đáng chú ý đối với một trong số chúng. Đây là lý do tại sao bạn đang gặp phải các vấn đề bạn đã đề cập với các chuỗi như eN%{S$u).
  • Ngay cả khi điểm trên không chính xác và biểu thức chính quy ở đây là chính xác, bạn có thể kết hợp bảng điều khiển thứ hai với .* theo sau chỉ bằng cách sử dụng .*\\d.*. câu trả lời
1

Giữ dễ dàng.

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

Mã hóa vui vẻ.

Chỉnh sửa, tinh khiết "biểu thức chính quy":

này đầu tiên khẳng định có 6 chữ cái của bất cứ điều gì trong cái nhìn về phía trước, và sau đó đảm bảo rằng trong nhìn về phía trước có cái gì đó mà không phải là alpha- số (nó sẽ "vứt bỏ" tối đa 5 ký tự đầu tiên cố gắng khớp).

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

Tôi đang giữ regexps trong tệp cấu hình, tôi không thể làm như vậy. – Reg

+0

Đầu vào này không thành công: 'lucero-1' – Lucero

+0

@Lucero Kiểm tra lại. Dữ liệu nhập đó không thành công. Nó chuyển biểu thức chính quy, như đã nêu trong yêu cầu - "chuỗi có độ dài tối thiểu 6 và nó chứa ít nhất một ký tự không phải chữ và số". Trong trường hợp này, "-" thỏa mãn yêu cầu thứ 2 và, tốt, độ dài đầu tiên. Tốt đẹp đảo ngược trong câu trả lời của bạn, btw. –

0

gì về điều đó (cố định): ^(?=.{6})(.*[^\w].*)$

Kiểm tra này ra http://www.ultrapico.com/Expresso.htm nó là công cụ tuyệt vời có thể giúp bạn rất nhiều trong regexps học tập.

+0

Kiểm tra đầu vào '! @ # $% ^' –

+0

Có vẻ như biểu thức đã bị hỏng bằng cách nào đó (tôi mong đợi sẽ thấy một số '. *' Và '\ w' tại vị trí tương ứng của chúng cho biểu thức có lý). – Lucero

+0

bạn đã đánh dấu gạch chéo ngược ở một trong các chỉnh sửa của mình. '[^ w]' phải là '[^ \ w]' hoặc '\ W'. –

3

marcog là khá tốt, nhưng tôi muốn làm điều đó theo cách khác xung quanh để nó dễ dàng hơn để thêm nhiều hơn điều kiện (chẳng hạn như có ít nhất một chữ số hoặc bất cứ điều gì), và tôi muốn sử dụng quantifiers lười biếng bởi vì họ là rẻ hơn cho các mẫu nhất định:

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

vì vậy, nếu bạn đã thêm điều kiện bổ sung đã đề cập, nó sẽ là như thế này:

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

như bạn có thể thấy, mô hình này có thể dễ dàng mở rộng.Lưu ý rằng được thiết kế để chỉ được sử dụng để kiểm tra các kết quả phù hợp, việc chụp của nó không hữu ích.

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