2015-02-08 15 views
5

tôi đang cố gắng để tạo ra một regex để xác nhận tên người dùng đó phải phù hợp với những điều sau đây:Regex để phù hợp với tên người dùng

  • Chỉ có một char đặc biệt (._-) phép và nó không phải ở extremas của chuỗi
  • ký tự đầu tiên không thể là một số
  • Tất cả các nhân vật khác cho phép là chữ và số
  • tổng chiều dài nên từ 3 đến 20 ký tự

Điều này là dành cho mẫu xác thực HTML5, thật đáng buồn phải là một regex lớn.

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

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20} 

Nhưng lookahead tích cực có thể được lặp đi lặp lại nhiều lần cho phép để có nhiều hơn một ký tự đặc biệt mà không phải là những gì tôi muốn. Và tôi không biết cách sửa nó.

+0

Không phải là câu trả lời được nêu ra - nhưng bạn cần phải phá vỡ '.' trong '[._-]'. – amit

+0

Đối với một cái gì đó phức tạp này, tại sao bạn chọn để đi với một mẫu xác nhận html? Bạn có thể kích hoạt sự kiện xử lý xác thực thay vì mẫu. – Eclecticist

+0

@amit [._-] là một ký tự đơn trong danh sách "._-" nghĩa là dấu chấm không được coi là bất kỳ ký tự nào, vì vậy tôi nghĩ rằng tôi không cần phải chia nhỏ nó – Tofandel

Trả lời

14

Bạn nên chia regex của bạn thành hai phần để làm cho bạn sống dễ dàng hơn (không phải là hai biểu thức!):

Thứ nhất, phù hợp với định dạng tên người dùng cần phải có: ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

Bây giờ, chúng ta chỉ cần xác nhận ràng buộc độ dài. Để không lộn xộn arround với mô hình đã được tìm thấy, bạn có thể sử dụng một trận đấu không tốn mà chỉ xác nhận số ký tự (litterally nó một hack để tạo một mô hình cho biểu thức chính quy của bạn): (?=^.{3,20}$)

Regex sẽ chỉ cố gắng khớp với định dạng hợp lệ nếu giới hạn độ dài được đối sánh. Nó không tốn kém, vì vậy sau khi nó thành công, động cơ vẫn là lúc bắt đầu của chuỗi.

như vậy, tất cả cùng nhau:

(?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$ 

Regular expression visualization

Debuggex Demo

+1

Cảm ơn bạn chủ của regex, công trình này (tôi chỉ cần thay thế cuối cùng * bởi một + vì vậy một char đặc biệt không thể ở cuối – Tofandel

+1

@ Adri1du40 lưu ý rằng là tốt. (Và đã sửa nó) – dognose

0

Tôi nghĩ bạn cần sử dụng ? thay vì +, vì vậy ký tự đặc biệt chỉ được khớp một lần hoặc không.

^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

+0

Điều đó sẽ chỉ cho phép một ký tự đặc biệt để bắt đầu chuỗi – Tofandel

+0

@ Adri1du40 Bạn có chắc chắn không? Tôi nghĩ rằng '?' Về cơ bản là '+' ngoại trừ nó chỉ phù hợp với 0 lần hoặc một lần. –

+0

Vâng, đây là những gì '?' nhưng nếu bạn để cho một nhân vật được không lần trước khi char đặc biệt, sau đó một char đặc biệt có thể là lúc bắt đầu – Tofandel

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