Android EditText中的验证允许IP或web Url主机

Android EditText中的验证允许IP或web Url主机,android,validation,android-edittext,Android,Validation,Android Edittext,我需要对我的EditText进行验证,以便它允许我输入有效的文本 ip地址格式(?)即示例132.0.25.225 或 web url格式(www.?)即示例www.example.com 逻辑是,若用户首先键入任何数值,则验证(IP)将执行操作 否则,用户必须在任何web字符串之前写入“www” 注意:它必须执行EditText的onKeyListener() 简而言之,我不打算检查用户何时完成输入并按下OK按钮 任何想法都值得赞赏, 谢谢。ip private static final St

我需要对我的EditText进行验证,以便它允许我输入有效的文本

ip地址格式(?)即示例132.0.25.225

web url格式(www.?)即示例www.example.com

逻辑是,若用户首先键入任何数值,则验证(IP)将执行操作

否则,用户必须在任何web字符串之前写入“www”

注意:它必须执行EditText的onKeyListener()

简而言之,我不打算检查用户何时完成输入并按下OK按钮

任何想法都值得赞赏, 谢谢。

ip

private static final String PATTERN = 
        "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";

public static boolean validate(final String ip){          
      Pattern pattern = Pattern.compile(PATTERN);
      Matcher matcher = pattern.matcher(ip);
      return matcher.matches();             
}
网址

试试这个

public void checkIP(String Value)
{
    Pattern pattern = Pattern.compile("[0-255].[0-255].[0-255].[0-255]");
    Matcher matcher = pattern.matcher(Value);
    boolean IPcheck = matcher.matches();
    if(IPcheck)
           //it is IP
        else
           //it is not IP


}
在编辑文本中添加一个

afterTextChanged (Editable s)
使用正则表达式验证输入,如果输入字符与正则表达式不匹配,只需使用以下方法将其删除

Editable.delete(int start, int end)

这个ione非常适合我在android中检查url

 if (!URLUtil.isValidUrl(url)) {
    Toast.makeText(this, "Invalid URL", Toast.LENGTH_SHORT).show();
    return;
    }

这里有一个不同的IP地址验证解决方案,但也可以作为web url验证的参考

EditText ipText = (EditText) findViewById(R.id.ip_address);
ipText.setKeyListener(IPAddressKeyListener.getInstance());

public class IPAddressKeyListener extends NumberKeyListener {

private char[] mAccepted;
private static IPAddressKeyListener sInstance;

@Override
protected char[] getAcceptedChars() {
    return mAccepted;
}

/**
 * The characters that are used.
 * 
 * @see KeyEvent#getMatch
 * @see #getAcceptedChars
 */
private static final char[] CHARACTERS =

new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };

private IPAddressKeyListener() {
    mAccepted = CHARACTERS;
}

/**
 * Returns a IPAddressKeyListener that accepts the digits 0 through 9, plus
 * the dot character, subject to IP address rules: the first character has
 * to be a digit, and no more than 3 dots are allowed.
 */
public static IPAddressKeyListener getInstance() {
    if (sInstance != null)
        return sInstance;

    sInstance = new IPAddressKeyListener();
    return sInstance;
}

/**
 * Display a number-only soft keyboard.
 */
public int getInputType() {
    return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
}

/**
 * Filter out unacceptable dot characters.
 */
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

    if (end > start) {
        String destTxt = dest.toString();
        String resultingTxt = destTxt.substring(0, dstart)
                + source.subSequence(start, end)
                + destTxt.substring(dend);
        if (!resultingTxt.matches("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) {
            return "";
        } else {
            String[] splits = resultingTxt.split("\\.");
            for (int i = 0; i < splits.length; i++) {
                if (Integer.valueOf(splits[i]) > 255) {
                    return "";
                }
            }
        }
    }
    return null;
}
公共类IPAddressKeyListener扩展了NumberKeyListener{
接受私人签名;
私有静态IPAddressKeyListener站;
@凌驾
受保护的字符[]getAcceptedChars(){
接受退货;
}
/**
*使用的字符。
* 
*@see KeyEvent#getMatch
*@see#getAcceptedChars
*/
私有静态最终字符[]个字符=
新字符[]{'0','1','2','3','4','5','6','7','8','9',';
专用IPAddressKeyListener(){
mAccepted=字符;
}
/**
*返回一个IPAddressKeyListener,它接受数字0到9,加上
*点字符,根据IP地址规则:第一个字符
*为数字,且不允许超过3个点。
*/
公共静态IPAddressKeyListener getInstance(){
if(sInstance!=null)
回归承诺;
sInstance=新IPAddressKeyListener();
回归承诺;
}
/**
*仅显示数字软键盘。
*/
public int getInputType(){
返回InputType.TYPE_类_数| InputType.TYPE_数_标志_小数;
}
/**
*过滤掉不可接受的点字符。
*/
@凌驾
公共CharSequence筛选器(CharSequence源、int开始、int结束、跨区目标、int开始、int结束){
如果(结束>开始){
字符串destTxt=dest.toString();
String resultingTxt=destTxt.substring(0,dstart)
+源.子序列(开始,结束)
+destTxt.substring(dend);
if(!resultingTxt.matches(“^\\d{1,3}”(\\d{1,3})(\\.(\\d{1,3})(\\.(\\d{1,3})?)?)?”){
返回“”;
}否则{
String[]splits=resultingTxt.split(“\\”);
对于(int i=0;i255){
返回“”;
}
}
}
}
返回null;
}

}应使用java.net.InetAddress类。您可以检查IP地址的所有格式:主机地址(例如:132.0.25.225)或主机名(例如:www.google.com); IPv4或IPv6格式正常

源代码应该在工作线程上运行,因为InetAddress.getAllByName(mStringHost)需要很长时间。例如:您从主机名获取地址

Thread mThread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            String mStringHost = "www.google.com";
            //String mStringHost = "192.168.1.2";
            InetAddress[] list_address = InetAddress.getAllByName(mStringHost);
            if(list_address != null && list_address.length >=1){
                InetAddress inetAddress = list_address[0];
                Log.d("test","inetAddress ="+ inetAddress.getHostAddress());
                if( inetAddress instanceof Inet4Address){
                    //IPv4 process
                }else{
                    //IPv6 process
                }
            }else{
                throw new Exception("invalid address");
            }
        }catch(Exception e){
            Log.e(TAG,"other exception",e);
            Toast.makeText(context, "Invalid host address or host name", Toast.LENGTH_SHORT).show();
            //process invalide ip address here
        }
    }
});

mThread.start()

你的回答很好。它解决了我的IP验证问题,但是新的java.net.URI(url);哪个检查网址格式不起作用相应的URL验证程序URL验证程序=新的URL验证程序();isvalidator.isValid(“);它并没有做我想要做的事情,但有帮助。
Thread mThread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            String mStringHost = "www.google.com";
            //String mStringHost = "192.168.1.2";
            InetAddress[] list_address = InetAddress.getAllByName(mStringHost);
            if(list_address != null && list_address.length >=1){
                InetAddress inetAddress = list_address[0];
                Log.d("test","inetAddress ="+ inetAddress.getHostAddress());
                if( inetAddress instanceof Inet4Address){
                    //IPv4 process
                }else{
                    //IPv6 process
                }
            }else{
                throw new Exception("invalid address");
            }
        }catch(Exception e){
            Log.e(TAG,"other exception",e);
            Toast.makeText(context, "Invalid host address or host name", Toast.LENGTH_SHORT).show();
            //process invalide ip address here
        }
    }
});

mThread.start()