2010-03-31 36 views
5

Đây là vấn đề của tôi:Xác thực số điện thoại java

Tạo hàm tạo cho số điện thoại được cung cấp dưới dạng xxx-xxx-xxxx hoặc xxx-xxxx cho số địa phương. Ném ngoại lệ nếu định dạng không hợp lệ.

Vì vậy, tôi đã suy nghĩ để xác thực nó bằng cách sử dụng một biểu thức chính quy, nhưng tôi không biết nếu tôi đang làm nó một cách chính xác. Ngoài ra tôi phải ném loại ngoại lệ nào? Tôi có cần tạo ngoại lệ của riêng mình không?

public TelephoneNumber(String aString){ 
     if(isPhoneNumberValid(aString)==true){ 
      StringTokenizer tokens = new StringTokenizer("-"); 
      if(tokens.countTokens()==3){ 
       areaCode = Integer.parseInt(tokens.nextToken()); 
       exchangeCode = Integer.parseInt(tokens.nextToken()); 
       number = Integer.parseInt(tokens.nextToken()); 
      } 
      else if(tokens.countTokens()==2){ 
       exchangeCode = Integer.parseInt(tokens.nextToken()); 
       number = Integer.parseInt(tokens.nextToken()); 
      } 
      else{ 
       //throw an excemption here 
      } 
     } 

    } 


public static boolean isPhoneNumberValid(String phoneNumber){ 
    boolean isValid = false; 

    //Initialize reg ex for phone number. 
    String expression = "(\\d{3})(\\[-])(\\d{4})$"; 
    CharSequence inputStr = phoneNumber; 
    Pattern pattern = Pattern.compile(expression); 
    Matcher matcher = pattern.matcher(inputStr); 
    if(matcher.matches()){ 
     isValid = true; 
    } 
     return isValid; 
    } 

Xin lỗi, có đây là bài tập về nhà. Đối với bài tập này, định dạng hợp lệ duy nhất là xxx-xxx-xxxx và xxx-xxxx, tất cả các định dạng khác (xxx) xxx-xxxx hoặc xxxxxxxxxx đều không hợp lệ trong trường hợp này.

Tôi muốn biết nếu biểu thức chính quy của tôi là đúng

+4

là bài tập về nhà này? nên được gắn thẻ như vậy nếu vậy ... – Brabster

+0

Câu hỏi rõ ràng: Bạn có chắc chắn rằng định dạng số điện thoại của bạn bắt được bất kỳ loại số điện thoại nào mà người dùng của bạn có thể muốn nhập không? Không có gì là bực bội hơn một hệ thống nửa thông minh mà từ chối chấp nhận dữ liệu hoàn toàn hợp lệ. (Ồ, và nếu đây chỉ là bài tập về nhà - đừng bận tâm.) – Tomalak

+0

Hoàn toàn đồng ý với @Tomalak. Nếu đây là hệ thống sản xuất, câu trả lời đúng là loại bỏ bất kỳ ký tự nào không phải là số và xác thực số kết quả. –

Trả lời

7

Vì vậy, tôi đã suy nghĩ để xác nhận nó sử dụng một biểu thức chính quy, nhưng tôi không biết nếu tôi làm việc đó một cách chính xác.

Thực sự có vẻ quá phức tạp. Ngoài ra, khớp với xxx-xxx-xxxx hoặc xxx-xxxx trong đó x là một chữ số có thể được thực hiện tốt hơn với "(\\d{3}-){1,2}\\d{4}". Để tìm hiểu thêm về regex, tôi khuyên bạn nên xem qua số http://regular-expressions.info.

Ngoài ra tôi sẽ phải loại ngoại lệ gì? Tôi có cần tạo ngoại lệ của riêng mình không?

A ValidatorException có vẻ thẳng về phía trước.

public static void isPhoneNumberValid(String phoneNumber) throws ValidatorException { 
    if (!phoneNumber.matches(regex)) { 
     throws ValidatorException("Invalid phone number"); 
    } 
} 

Nếu bạn không muốn tự tạo một lý do vì lý do nào đó, tôi có thể chọn IllegalArgumentException, nhưng tôi vẫn không khuyến cáo điều đó.

Điều đó nói rằng, xác thực này tất nhiên không bao gồm số điện thoại quốc tế và/hoặc bên ngoài. Trừ khi điều này thực sự là bài tập về nhà, tôi khuyên bạn nên suy nghĩ lại việc xác nhận.

0

Bạn có thể khớp các mẫu đó dễ dàng như đề xuất của BalusC.

Lưu ý phụ, StringTokenizer không được dùng nữa. Từ JavaDoc:

StringTokenizer là lớp cũ được giữ nguyên vì lý do tương thích mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Đó là khuyến cáo rằng bất cứ ai tìm kiếm chức năng này sử dụng phương pháp chia String hoặc gói java.util.regex thay thế.

Một cách dễ dàng hơn để chia chuỗi của bạn vào đoạn đường thích hợp sẽ là:

String phoneParts[] = phoneNumber.split("-"); 
3
^(([(]?(\d{2,4})[)]?)|(\d{2,4})|([+1-9]+\d{1,2}))?[-\s]?(\d{2,3})?[-\s]?((\d{7,8})|(\d{3,4}[-\s]\d{3,4}))$ 

trận đấu: (0060) 123-12.345.678, (0060) 12312345678, (832) 123- 1234567, (006) 03-12.345.678,

(006) 03-12345678, 00.603-12.345.678, 0060312345678

0000-123-12345678, 0000-12-12 345.678, 0000-1212345678 ... vv

1234-5678, 01-123-4567

có thể thay thế '-' với SPACE tức (0080) 123 12345678

Cũng phù hợp + 82-123 -1234567, +82 123 1234567, +800 01 12345678 ... v.v.

Thêm thông tin về số nhà riêng/số nhà riêng. Không cho 1-800-000-0000 loại số

*Tested with Regex tester http://regexpal.com/

+0

Vui lòng đọc câu hỏi thay vì chỉ tiêu đề. Đây không phải là những gì OP yêu cầu. * "Đối với bài tập này, định dạng hợp lệ duy nhất là xxx-xxx-xxxx và xxx-xxxx, tất cả các định dạng khác (xxx) xxx-xxxx hoặc xxxxxxxxxx không hợp lệ trong trường hợp này." * – BalusC

+0

Vì đây là lần thứ hai bạn đang thực hiện , Tôi chỉ muốn thông báo rằng Stack Overflow là một trang Hỏi & Đáp. Nó không phải là một diễn đàn thảo luận, nơi tất cả mọi người tìm kiếm câu trả lời chính xác đã lội qua một mớ hỗn độn của các câu trả lời lặp đi lặp lại/overgeneralized để tìm câu trả lời chính xác một là tìm kiếm. – BalusC

+3

FYI, rất nhiều nhà phát triển đang tìm kiếm câu trả lời 'tương tự' nhưng không chính xác. Tôi chỉ cố gắng đóng góp lại cho cộng đồng để họ không phải lội qua các trang web khác để tìm kiếm những gì họ muốn. Giống như trường hợp của tôi, tôi chỉ muốn có một regex xác nhận toàn diện và trang này đã truyền cảm hứng cho tôi. Mặc dù không trả lời trực tiếp, bài viết của tôi ít nhất là phù hợp với bối cảnh. Thật khó để tìm một người yêu cầu cùng một câu hỏi mà U muốn. – peterong

-3

Chuỗi Mã PIN = "589.877";

Pattern pattern = Pattern.compile("\\d{6}"); 

\ d cho biết các chữ số. bên trong niềng răng số chữ số Matcher matcher = pattern.matcher (pincode);

if (matcher.matches()) { 
     System.out.println("Pincode is Valid"); 
     return true; 
    } else { 
     System.out.println("pincode must be a 6 digit Number"); 
+2

Bạn đã đọc câu hỏi chưa? Đây không phải là những gì OP đã hỏi. – Syon

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