2009-06-27 61 views

Trả lời

53
^\d*[a-zA-Z][a-zA-Z0-9]*$ 

Về cơ bản, điều này có nghĩa là:

  • Không hoặc nhiều hơn Mã ASCII;
  • Một ký tự ASCII chữ cái;
  • Không hoặc nhiều ký tự ASCII chữ số và số.

Hãy thử một vài thử nghiệm và bạn sẽ thấy điều này sẽ vượt qua bất kỳ chuỗi ASCII chữ và số nào mà ít nhất một ký tự ASCII không phải là số được yêu cầu.

Chìa khóa cho điều này là \d* ở mặt trước. Nếu không có nó thì regex sẽ trở nên khó xử hơn nhiều.

+0

"Một ký tự chữ và số" phải đọc "Một ký tự chữ cái" hoặc tương tự: phần đó của regex không bao gồm chữ số. –

+0

\ d * là thông minh! –

+0

@ R.Pate: khá đúng. Đã sửa. Cảm ơn. – cletus

1
^[0-9]*[A-Za-z][0-9A-Za-z]*$ 

là regex sẽ làm những gì bạn đang theo dõi.^Và $ khớp với phần đầu và cuối của từ để ngăn các ký tự khác. Bạn có thể thay thế khối [0-9A-z] bằng \ w, nhưng tôi thích dạng chi tiết hơn vì nó dễ mở rộng hơn với các ký tự khác nếu bạn muốn.

Thêm trình xác thực biểu thức chính quy vào trang asp.net của bạn theo hướng dẫn trên MSDN: http://msdn.microsoft.com/en-us/library/ms998267.aspx.

+0

này có thể chứa tất cả các số, phải không? – akf

+0

bỏ sót chút ít về việc cần ít nhất một ký tự - tôi đã chỉnh sửa để buộc ít nhất một ký tự – Dexter

+0

Nếu bạn không chụp, bạn không cần() ngoại trừ nhóm và [] tạo một nhóm tiền phạt. A-z không chỉ là chữ cái. Bạn có thể có nghĩa là [0-9A-Za-z] * [A-Za-z] [0-9A-Za-z] * –

1
^\w*[\p{L}]\w*$ 

Điều này không khó. Biểu thức chính quy đọc: khớp với một dòng bắt đầu với bất kỳ số ký tự từ nào (chữ cái, số, dấu câu (mà bạn có thể không muốn)), có chứa một ký tự chữ cái (đó là phần [\p{L}] ở giữa), theo sau là bất kỳ số nào từ ký tự một lần nữa.

Nếu bạn muốn loại trừ dấu chấm câu, bạn sẽ cần một biểu hiện heftier:

^[\p{L}\p{N}]*[\p{L}][\p{L}\p{N}]*$ 

Và nếu bạn không quan tâm đến Unicode bạn có thể sử dụng một biểu nhàm chán:

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$ 
+1

Bạn cần^và $ đổi chỗ. –

+0

@R. Pate: Cảm ơn. Nó sẽ không được mã nếu nó không có lỗi. – Welbog

4
^[\p{L}\p{N}]*\p{L}[\p{L}\p{N}]*$ 

Giải thích:

  • [\p{L}\p{N}]* phù hợp không hay nhiều chữ Unicode hoặc số
  • \p{L} trận đấu một bức thư
  • [\p{L}\p{N}]* trận đấu không hay nhiều chữ Unicode hoặc số
  • ^$ neo chuỗi, đảm bảo regex khớp với toàn bộ chuỗi. Bạn có thể bỏ qua những điều này, tùy thuộc vào chức năng phù hợp với regex bạn gọi.

Kết quả: bạn có thể có bất kỳ chuỗi ký tự chữ và số nào trừ khi phải có chữ cái ở đâu đó.

\p{L} tương tự như [A-Za-z] ngoại trừ nó sẽ bao gồm tất cả các chữ cái từ tất cả các bảng chữ cái, có hoặc không có dấu trọng âm và dấu phụ. Nó bao gồm nhiều hơn, sử dụng một bộ ký tự Unicode lớn hơn. Nếu bạn không muốn thay thế linh hoạt đó [A-Za-z]. Một nhận xét tương tự áp dụng cho \p{N} có thể được thay thế bằng [0-9] nếu bạn muốn giữ cho nó đơn giản. Xem MSDN page on character classes để biết thêm thông tin.

Phiên bản phi Unicode ít ưa thích sẽ là

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$ 
+4

\ p {N} sẽ khớp với các số Unicode, chẳng hạn như ① ②. Điều này có thể gây ngạc nhiên cho một số. –

+3

và \ p {L} cũng khớp với chữ cái Trung Quốc. trước khi sử dụng .. –

+0

Chuyển phần đầu tiên, [\ p {L} \ p {N}] * thành \ p {N} * đơn giản hóa lời giải thích và ngăn chặn một số theo dõi ngược lại. –

0
^[0-9]*[a-zA-Z][a-zA-Z0-9]*$ 

Có thể

  • bất kỳ số kết thúc với một nhân vật,
  • hoặc một biểu thức chữ và số bắt đầu với một nhân vật
  • hoặc một biểu thức chữ và số bắt đầu bằng một số, theo sau là ký tự và kết thúc ed với một subexpression chữ và số
+0

Không giống như trên cùng Chỉ cần với \ d thay thế bằng [0-9] –

+0

Vâng, vâng, tôi không thấy rằng tại thời điểm đăng bài – eKek0

18

Hầu hết các câu trả lời cho câu hỏi này là chính xác, nhưng có một sự thay thế, mà (trong một số trường hợp) cung cấp linh hoạt hơn nếu bạn muốn thay đổi các quy tắc sau:

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]+)$ 

Điều này sẽ khớp với bất kỳ chuỗi ký tự chữ và số nào, nhưng chỉ khi nhóm đầu tiên cũng khớp với toàn bộ chuỗi. Đó là một mẹo nhỏ trong các biểu thức chính quy cho phép bạn xử lý một số vấn đề xác thực rất khó khăn.

Ví dụ: giả sử bạn cần thêm ràng buộc khác: chuỗi phải dài từ 6 đến 12 ký tự. Các giải pháp rõ ràng được đăng ở đây sẽ không hoạt động, nhưng bằng cách sử dụng mẹo tìm kiếm trước, regex chỉ đơn giản là trở thành:

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]{6,12})$ 
+0

Mục đích thứ hai là gì? * có? –

+0

Không :-) Nó có thể được an toàn ommitted . –

+0

Tôi biết rằng đây là một bài viết rất cũ nhưng điều này đã giúp tôi tiết kiệm rất nhiều thời gian và rắc rối hiện nay. LƯU Ý: trong mẫu thứ hai, yêu cầu * IS thứ hai nếu bạn muốn nó thực thi đúng. Cảm ơn một lần nữa. –

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