2009-08-31 70 views
5

Tôi đang cố xác thực tính năng nhập của người dùng, chỉ là số được phân tách bằng dấu phẩy. Tôi muốn làm điều này với RegEx, nhưng không thể đưa ra biểu thức đúng.Regex cho số được phân tách bằng dấu phẩy

Cần xác nhận các chuỗi kí tự sau (và lớn hơn):

1 
12 
123 
1,234 
12,345 
123,456 

và vô hiệu hóa các chuỗi kí tự sau (và điên):

1,1 
1,12 
12,1 
12,12 
123,1 
123,1 

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

Đây là những gì tôi đã cố gắng cho đến nay (EDIT: mà không làm việc), cùng với một số biến thể ->

^(((\d{1,3},)*\d{3})|(\d{1,3}))$ 
^(\d{1,3}[,])*\d{3}|\d{1,3}$ 

Trả lời

14

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

^\d{1,3}([,]\d{3})*$ 

Về cơ bản bạn có thể có 1-3 chữ số miễn phí. Sau đó, bạn cần dấu phẩy. Nếu bạn có dấu phẩy, nó phải được thêm phải bằng 3 chữ số khác. Chuỗi gồm 3 chữ số đó có thể xuất hiện bất kỳ số lần nào.

EDIT: Như Andrew Hare quan sát, bạn không quan tâm về những gì đã được tìm thấy bên trong ngoặc ngoài thực tế là nó phù hợp, vì vậy bạn có thể sử dụng một nhóm phi chụp thay vì bằng cách đặt ?: sau dấu mở ngoặc:

^\d{1,3}(?:[,]\d{3})*$ 
+3

+1 Được thực hiện tốt. Chỉ trích duy nhất của tôi: vì biểu thức chính quy này chỉ để xác thực bạn nên thay đổi nhóm chụp đó thành một nhóm không bắt giữ. –

+2

Điểm tốt, nhưng nó luôn luôn làm phiền tôi rằng làm cho một nhóm không nắm bắt làm cho regex xấu xí hơn. –

+0

nhìn vào regex ban đầu có vẻ thắp sáng một chuỗi như 12.1123 là hợp pháp ((\ d {1,3},) * \ d {3}) mà ở trên không đáp ứng –

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