如何验证电话号码格式

问题描述:

我即将创建电话号码格式验证。格式为10位数字,包括加号,例如:+0133999504。即使我已经声明了模式,我试图禁止使用“ - ”符号或任何其他字符,但验证不起作用。任何其他想法或解决方案?如何验证电话号码格式

1st I declared the string regex: 

String PhoneNo; 
String PhoneNo_PATTERN ="[\\+]\\d{3}\\d{7}"; 

2nd I make a if..else statement: 
{ 
        Pattern pattern = Pattern.compile(PhoneNo_PATTERN); 
        Matcher matcher = pattern.matcher(PhoneNo); 
        if (!matcher.matches()) 
        { 
        inputemergencyContactNo.setError("Please enter Emergency Contact No"); 
        } 
        else{ 
        Toast.makeText(RiderProfile.this, "Please filled in All field", Toast.LENGTH_SHORT).show(); 
        } 

为什么不能消除所有的非数字和再算上剩余的数字并在以后再加回来?这允许用户*反正要填写自己的电话号码,他们想...

String PhoneNo = "+123-456 7890"; 
String Regex = "[^\\d]"; 
String PhoneDigits = PhoneNo.replaceAll(Regex, ""); 
if (PhoneDigits.length()!=10) 
{ 
    // error message 
} 
else 
{ 
    PhoneNo = "+"; 
    PhoneNo = PhoneNo.concat(PhoneDigits); // adding the plus sign 

    // validation successful 

} 

如果你的应用程序的目的是在国际上使用替代

if (!PhoneDigits.length()!=10) 

if(PhoneDigits.length() < 6 || PhoneDigits.length() > 13) 

为Fatti汗建议。


要在你张贴在Android EditText Validation and Regex代码应用此首先包括在公共类此方法,或者含有的onClick()类:

public boolean validateNumber(String S) { 
    String Regex = "[^\\d]"; 
    String PhoneDigits = S.replaceAll(Regex, ""); 
    return (PhoneDigits.length()!=10); 
} 

,包括在CreateNewRider类此方法:

protected String tidyNumber(String S) { 
    String Regex = "[^\\d]"; 
    String PhoneDigits = S.replaceAll(Regex, ""); 
    String Plus = "+"; 
    return Plus.concat(PhoneDigits); 
} 

这是验证发生......

@Override 
public void onClick(View view) { 

    Boolean b = false; 
    if(inputfullname.getText().toString().equals("")) b = true; 

    else if(... // do this for all fields 

    else if(inputmobileNo.getText().toString().equals("")) b=true; 
    else if(inputemergencyContactNo.getText().toString().equals("")) b=true; 
    else { 
     if(validateNumber(inputmobileNo.getText().toString()) 
      Toast.makeText(RiderProfile.this, "Invalid mobile number", Toast.LENGTH_SHORT).show(); 

     else if(validateNumber(inputemergencyContactNo.getText().toString()) 
      Toast.makeText(RiderProfile.this, "Invalid emergency contact number", Toast.LENGTH_SHORT).show(); 
     else { 
      // Validation succesful 

      new CreateNewRider().execute(); 

     } 
    } 
    if(b) Toast.makeText(RiderProfile.this, "Please filled in All field", Toast.LENGTH_SHORT).show(); 
} 

然后在CreateNewRider类使用tidyNumber():

protected String doInBackground(String... args) { 
     String fullname= inputfullname.getText().toString(); 
     String IC= inputIC.getText().toString(); 
     String mobileNo= tidyNumber(inputmobileNo.getText().toString()); 
     String emergencyContactName= inputemergencyContactName.getText().toString()); 
     String emergencyContactNo= tidyNumber(inputemergencyContactNo.getText().toString()); 

     ... 
+0

谢谢你的想法n解决方案..我会尝试插入到我的编码..tq这么多.. – 2014-12-03 06:25:42

+0

我试过编码,但它似乎不是工作.. – 2014-12-03 06:52:30

+0

我修复了代码中的一些错误。让我知道,如果它现在适合你... – 2014-12-03 17:01:00

^[\\+]\\d{3}\\d{7}$ 

使用锚来限制对手。

^ =>开始比赛的

$匹配

的=>端鉴于你指定的规则:

高达长度13和包括字符+盈。

(也包含10在你的代码的最小长度)

你会希望有一个正则表达式看起来像这样:

^\+[0-9]{10,13}$ 

随着最小和最大长度的编码正则表达式,你可以从你的if()块中删除这些条件。

偏题:我建议10-13的范围对于国际电话号码字段来说太局限了;你几乎肯定会发现有效的数字比这更长和更短。我建议8-20的范围是安全的。

[编辑] OP指出由于转义序列,上述正则表达式不起作用。不知道为什么,但一个替代将是:

^[+][0-9]{10,13}$ 

[编辑2] OP现在添加+符号应该是可选的。在这种情况下,正则表达式需要+后一个问号,所以上面的例子,现在应该是这样的:

^[+]?[0-9]{10,13}$ 

对于有效的手机你需要考虑的7位至13位,因为一些国家有7位手机号码。此外,我们不能像查询手机号码必须与9或8或任何启动..

对于手机号码,我用这个这个功能

private boolean isValidMobile(String phone2) 
{ 
    boolean check; 
    if(phone2.length() < 6 || phone2.length() > 13) 
    { 
     check = false; 
     txtPhone.setError("Not Valid Number"); 
    } 
    else 
    { 
     check = true; 
    } 
    return check; 
} 
+0

谢谢fatti khan为你的好主意n解决方案.. – 2014-12-03 06:26:10

使用this我的电话号码的验证和它的作品般的魅力。它涵盖了手机验证以及开发者希望用电话号码尝试的更多内容。