2012-04-25 32 views
5

Tôi vẫn còn rất mới đối với Regex và về cơ bản những gì tôi cần làm là tạo quy tắc chấp nhận số và chữ nhưng không được nhập ký tự liên tiếp.Regex Từ chối các ký tự liên tiếp

Ví dụ: abcd -> ok, abbcd -> xấu

tôi có hầu hết nó hoạt động nhưng phần tôi không thể hình dung ra là chính xác làm thế nào để ngăn cấm nhân vật liên tiếp?

My Mã cho đến nay:

/^[A-Za-z-0-9]{8,15}$/i 
+0

Lúc đầu, tôi nghĩ rằng dấu trừ giữa z và 0 được nhấn mạnh và nếu nó quá bạn nên sử dụng '[\ w]' thay cho '[A-Za-z_0-9]' – shift66

Trả lời

4
>>> r = /^((\w)(?!\2))+$/i 
>>> r.exec('abbcd') 
null 
>>> r.exec('abcd') 
[ 'abcd', 
    'd', 
    'd', 
    index: 0, 
    input: 'abcd' ] 

Phần \2 là một tham chiếu trở lại và trận đấu nào nhân vật lần cuối kết hợp bởi nhóm (\w). Vì vậy, các lookahead tiêu cực (?!\2) có nghĩa là "không theo sau bởi các nhân vật chính nó." Nếu một số thuật ngữ tôi sử dụng ở đây không quen thuộc với bạn, bạn nên tìm kiếm chúng trên MDN's Regular Expression Documentation.

Để hạn chế chiều dài của chuỗi nhận vào 8-15 ký tự như trong OP, thay đổi +-{8,15}:

>>> r = /^((\w)(?!\2)){8,15}$/i 
>>> r.exec('abcd') 
null 
>>> r.exec('abcdabcd') 
[ 'abcdabcd', 
    'd', 
    'd', 
    index: 0, 
    input: 'abcdabcd' ] 
+0

điều với câu trả lời này là nó loại bỏ quy tắc giới hạn của tôi mà người dùng phải nhập tối thiểu 8 ký tự nhưng không còn hơn 16. – shade917

+0

@ shade917: Bạn có thể thay đổi dấu '+' thành '{8,15}' (từ câu hỏi của bạn) để đạt được điều đó. –

+0

Xin cảm ơn rất nhiều bạn, điều này hoàn toàn phù hợp với tôi! – shade917

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