如何在 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 设备上)?