如何在 Android 上验证 IP 地址?

Posted

技术标签:

【中文标题】如何在 Android 上验证 IP 地址?【英文标题】:How do you validate an IP address on Android? 【发布时间】:2011-04-11 12:19:41 【问题描述】:

我在 android(作为客户端)和 PC(作为服务器)之间使用简单的套接字通信。我让用户将 IP 地址输入到 EditText 字段中,并且我想验证 IP 地址。

【问题讨论】:

【参考方案1】:
Patterns.IP_ADDRESS.matcher(url).matches();

【讨论】:

尽可能简单。 完美...简单优雅 如何用端口做ip? @MichaelMao 要验证端口,您只需验证它是 0-65535 之间的数字 最佳答案。【参考方案2】:

API 级别 8+:

您可以使用Patterns.IP_ADDRESS 全局正则表达式。

API 级别 1-7:

如果你的目标设备是 android

private static final Pattern IP_ADDRESS
    = Pattern.compile(
        "((25[0-5]|2[0-4][0-9]|[0-1][0-9]2|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]"
        + "[0-9]|[0-1][0-9]2|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]"
        + "[0-9]2|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]2"
        + "|[1-9][0-9]|[0-9]))");
Matcher matcher = IP_ADDRESS.matcher("127.0.0.1");
if (matcher.matches()) 
    // ip is correct

【讨论】:

【参考方案3】:

要在输入 IP 时检查它,您可能需要使用它:

private static final Pattern PARTIAl_IP_ADDRESS =
          Pattern.compile("^((25[0-5]|2[0-4][0-9]|[0-1][0-9]2|[1-9][0-9]|[0-9])\\.)0,3"+
                           "((25[0-5]|2[0-4][0-9]|[0-1][0-9]2|[1-9][0-9]|[0-9]))0,1$"); 

ipEditText.addTextChangedListener(new TextWatcher()                        
    @Override public void onTextChanged(CharSequence s, int start, int before, int count)             
    @Override public void beforeTextChanged(CharSequence s,int start,int count,int after)             

    private String mPreviousText = "";          
    @Override
    public void afterTextChanged(Editable s)           
        if(PARTIAl_IP_ADDRESS.matcher(s).matches()) 
            mPreviousText = s.toString();
         else 
            s.replace(0, s.length(), mPreviousText);
        
    
);

【讨论】:

谢谢你,非常有用:) 这很棒,很容易概括为某种“RegexValidator”,可以轻松添加到任何 EditText 以用于其他用例:) 更新:在此处添加了 (Kotlin) 要点:gist.github.com/kiwiandroiddev/5c3b8d527aaf8b8318007fb685f23c5d【参考方案4】:

Kotlin 中寻找有效 IP 的解决方案:

import java.util.regex.*;
 ...
 ...
    fun isValidIPAddress(ip:String):Boolean 
      // Regex for digit from 0 to 255
      val reg0To255 = ("(\\d1,2|(0|1)\\" + "d2|2[0-4]\\d|25[0-5])")
      // regex 0 To 255 followed by a dot, 4 times repeat
      // validation an IP address.
      val regex = (reg0To255 + "\\."
                   + reg0To255 + "\\."
                   + reg0To255 + "\\."
                   + reg0To255)
      val p = Pattern.compile(regex)
      val m = p.matcher(ip)
      return m.matches()
    
    
    val inputIP = "127.1.1.775"
    println("Input: " + inputIP)
    println("Output: " + isValidIPAddress(inputIP))
    
 ...
 ...

输入:127.1.1.055 输出:真

输入:127.ip.1.75 输出:假

输入:127.201.1.775 输出:假

【讨论】:

【参考方案5】:

阅读关于Patterns.IP_ADDRESS 的描述我已经看到它将被弃用(在 API 31 上)并且需要使用另一个函数 (InetAddresses.isNumericAddress) 来检查 IP 地址。

结果:

fun isIpValid(ip: String): Boolean 
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
        InetAddresses.isNumericAddress(ip)
     else 
        Patterns.IP_ADDRESS.matcher(ip).matches()
    

【讨论】:

以上是关于如何在 Android 上验证 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上以编程方式从 Mac 地址获取 IP 地址?

如何轻松检索我的全部或部分外部 IP 地址(在 Android 设备上)?

在Android上检测wifi IP地址?

如何验证广播 IP 地址?

如何在同一网络上以编程方式获取其他支持Wifi的设备的IP地址?

如何在jquery中检查IP地址的验证