2011-07-29 15 views
6

Tôi muốn kiểm tra xem đầu vào của người dùng ở phía máy chủ hay chưa. Nếu người dùng nhập vào một số 111111 hoặc 22222 trong đó có các con số tương tự, và cũng nếu đầu vào là theo thứ tự như 12345 hoặc 456789.RegEx để kiểm tra xem các số trong một số có giống nhau hay theo thứ tự

+0

Còn 8910 thì sao? Đó có phải là 'chuỗi' không? –

+0

Điều gì về 2335777, là "theo thứ tự"? – Cephalopod

Trả lời

11

Để phù hợp với cùng một chữ số liên tiếp:

^([0-9])\1*$ 

Lưu ý rằng bạn có để thoát khỏi dấu gạch chéo ngược khi bạn đặt nó trong một chuỗi java chữ, ví dụ "^([0-9])\\1*$".

Đối với thứ hai, bạn phải tạo danh sách các chữ số liên tiếp một cách rõ ràng bằng cách sử dụng toán tử |. Các regex sẽ thực sự dài và khó chịu với nhiều như 10-lồng nhau parantheses. Người ta phải tạo ra regex này bằng cách sử dụng một chương trình. Nói cách khác, đây là một vấn đề sai để giải quyết bằng cách sử dụng regex. Nó sẽ đơn giản hơn nhiều để viết một vòng lặp và kiểm tra điều này.

+0

Vâng, bạn nói đúng. Giải quyết với RegEx thực sự khó chịu. Tôi giải quyết nó với người bạn cũ tốt cho vòng lặp. Cảm ơn vì sự giúp đỡ. – yyy

+0

@SusamPal, (4 năm sau ...) cool (+1)! xin vui lòng xem câu trả lời của tôi cho lần thứ hai. – JJoao

1

mô hình này sẽ phù hợp nếu người dùng nhập các chữ số giống nhau:

^(\d)\1*$ 

\1 phù hợp với nhóm chụp đầu tiên, vì vậy mô hình phù hợp cho dù đó là chữ số đầu tiên được lặp lại cho toàn bộ chuỗi.

Vấn đề thứ hai (chữ số liên tiếp) có phần khó khăn hơn.

^(?:^(?:^(?:^(?:^0?1)?2)?3)4?)?5(?:$|6(?:$|7(?:$|8(?:$|90?))))$| 
    ^(0?1)?2(?:$|3(?:$|4))|^(6?7)?8(?:$|90?)$ 

là một triển khai, giả sử ba chữ số trở lên. Nhưng vì số lượng kết hợp nhỏ, liệt kê (4 chữ số) cũng có thể:

^(?:0?123(45?)?|1?23456?|2?34567?|3?45678?|4?56789?|(5?6)?7890?| 
     (0?1)?2345678?(90$)?|1?23456789?|2?345678(90?)?)$ 

Tất cả điều này nói, cụm từ thông dụng không phải lúc nào cũng hoạt động tốt cho loại sự cố này. Một phương pháp Java để kiểm tra trình tự này có thể sạch hơn.

+0

Regex thứ hai không khớp với chuỗi như "123", "345", v.v. Chỉnh sửa: Ok, bây giờ tôi thấy rằng bạn đã giả định "6 chữ số". –

+0

cảm ơn Susam, tôi thấy rằng 6 chữ số không phải là yêu cầu và đã chỉnh sửa bài đăng để làm cho bài viết trở nên chung chung hơn. – drf

+0

giải quyết nếu số bắt đầu bằng 0 hoặc 1 tôi nghĩ. Đối với vòng lặp là hữu ích nhiều. Thanx btw. – yyy

0

thời gian trong perl này, để giải thích trường hợp thứ hai dễ dàng hơn:

perl -nlE 'say "BAD number" if ($_ =~ /^(\d)\1*$/ or "123456789" =~ /$_/)' 

Giải thích:

  • trường hợp 1: đầu vào ∈ /(\d)\1*/ ngôn ngữ: đã trình bày ($_ =~ /^(\d)\1*$/)
  • trường hợp 2: chuỗi "123456789" khớp với đầu vào ("123456789" =~ /$_/)
Các vấn đề liên quan