【发布时间】:2011-04-11 12:19:41
【问题描述】:
我在 Android(作为客户端)和 PC(作为服务器)之间使用简单的套接字通信。我让用户将 IP 地址输入到 EditText 字段中,并且我想验证 IP 地址。如何在 Android 上验证 IP 地址?
【问题讨论】:
标签: android
我在 Android(作为客户端)和 PC(作为服务器)之间使用简单的套接字通信。我让用户将 IP 地址输入到 EditText 字段中,并且我想验证 IP 地址。如何在 Android 上验证 IP 地址?
【问题讨论】:
标签: android
Patterns.IP_ADDRESS.matcher(url).matches();
【讨论】:
您可以使用Patterns.IP_ADDRESS 全局正则表达式。
如果你的目标设备是 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
}
【讨论】:
要在输入 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);
}
}
});
【讨论】:
Kotlin 中寻找有效 IP 的解决方案:
import java.util.regex.*;
...
...
fun isValidIPAddress(ip:String):Boolean {
// Regex for digit from 0 to 255
val reg0To255 = ("(\\d{1,2}|(0|1)\\" + "d{2}|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 输出:假
【讨论】:
阅读关于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()
}
}
【讨论】: