如何验证电话号码格式

4

我要创建一个验证电话号码格式的程序。该格式为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();
                    }
4个回答

4

根据您指定的规则:

长度最多为13,且包括前置字符“+”。

(并在代码中加入最小长度为10)

您需要使用以下正则表达式:

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

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

离题:我建议国际电话号码字段的范围为10-13太受限制了;您几乎肯定会找到比此更长或更短的有效号码。 我建议使用8-20的范围以确保安全。

[编辑] OP表示上述正则表达式由于转义序列而无法工作。 不知道为什么,但另一种选择是:

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

[EDIT 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;
}

4
为什么不先移除所有非数字字符,然后计算剩下的数字个数,最后再把加号加回去呢?这样用户就可以任意填写他们的电话号码了...
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 Khan所建议的那样。


要在您在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() );

        ...

谢谢你的想法和解决方案。我会尝试将其插入到我的代码中。非常感谢。 - king yaya
我已经尝试了你的代码,但仍然无法正常工作。如果我向您展示我的完整代码,是否可能? - king yaya
1
你不需要展示你的全部代码,但是在你粘贴这段代码的周围多加一些内容会有所帮助。同时,了解你得到的确切错误/调试信息也会有所帮助... - M '431
非常感谢!!!它适用于我的无手机格式..终于..感谢您的帮助..注意!!! - king yaya
非常感谢!这就是现在需要的!感谢你的贡献和指导!终于成功了,真的是太感谢你帮我的忙了。@M'431 - king yaya

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

使用锚点来限制匹配。

^ => 匹配开始位置

$ => 匹配结束位置


0
To validate India's mobile number.

Your edit text input 
edt_mobile.text.toString().trim()

Number validation method

    fun isValidMobile(phone: String): Boolean {
                return phone.matches(Constants.REGEX_MOBILE.toRegex()) && phone.trim().length == 10
      }

Regression expression 



 const val REGEX_MOBILE = "^[6-9]{1}[0-9]{9}\$"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接