|
@@ -120,7 +120,13 @@ fun String.isEx(): Boolean {
|
|
return this.all { it in '!'..'~' }
|
|
return this.all { it in '!'..'~' }
|
|
}
|
|
}
|
|
|
|
|
|
-data class AddrPort(val addr: String, val port: Int)
|
|
|
|
|
|
+enum class AddrType {
|
|
|
|
+ Host,
|
|
|
|
+ Ipv4,
|
|
|
|
+ Ipv6,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+data class AddrPort(val addr: String, val addr_type: AddrType, val port: Int)
|
|
|
|
|
|
/**
|
|
/**
|
|
* 将当前字符串解析为主机地址和端口号,返回一个包含地址和端口的 AddrPort 对象。
|
|
* 将当前字符串解析为主机地址和端口号,返回一个包含地址和端口的 AddrPort 对象。
|
|
@@ -130,19 +136,44 @@ data class AddrPort(val addr: String, val port: Int)
|
|
*
|
|
*
|
|
* @return 如果解析成功,返回包含地址和端口的 AddrPort 对象;如果解析失败或格式无效,则返回 null。
|
|
* @return 如果解析成功,返回包含地址和端口的 AddrPort 对象;如果解析失败或格式无效,则返回 null。
|
|
*/
|
|
*/
|
|
-fun String.toAddrPort(): AddrPort? {
|
|
|
|
|
|
+fun String?.toAddrPort(): AddrPort? {
|
|
|
|
+ if (this == null) return null
|
|
if (this.isBlank()) return null
|
|
if (this.isBlank()) return null
|
|
Regex("\\[([a-fA-F0-9:]+)]:(\\d+)").matchEntire(this)?.also {
|
|
Regex("\\[([a-fA-F0-9:]+)]:(\\d+)").matchEntire(this)?.also {
|
|
val j_port = it.groupValues[2].toIntOrNull()
|
|
val j_port = it.groupValues[2].toIntOrNull()
|
|
- if (j_port != null && j_port in 1..65535) return AddrPort(it.groupValues[1], j_port)
|
|
|
|
|
|
+ if (j_port != null && j_port in 1..65535 && it.groupValues[1].isIpv6()) return AddrPort(it.groupValues[1], AddrType.Ipv6, j_port)
|
|
}
|
|
}
|
|
Regex("([a-zA-Z0-9.-]+):(\\d+)").matchEntire(this)?.also {
|
|
Regex("([a-zA-Z0-9.-]+):(\\d+)").matchEntire(this)?.also {
|
|
val j_port = it.groupValues[2].toIntOrNull()
|
|
val j_port = it.groupValues[2].toIntOrNull()
|
|
- if (j_port != null && j_port in 1..65535) return AddrPort(it.groupValues[1], j_port)
|
|
|
|
|
|
+ if (j_port != null && j_port in 1..65535) {
|
|
|
|
+ if (it.groupValues[1].isIpv4()) return AddrPort(it.groupValues[1], AddrType.Ipv4, j_port)
|
|
|
|
+ return AddrPort(it.groupValues[1], AddrType.Host, j_port)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return null
|
|
return null
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * 判断当前字符串是否为有效的IPv4地址格式。
|
|
|
|
+ *
|
|
|
|
+ * @return 如果字符串是有效的IPv4地址格式,返回true;否则返回false。
|
|
|
|
+ */
|
|
|
|
+fun String?.isIpv4(): Boolean {
|
|
|
|
+ if (this == null) return false
|
|
|
|
+ return Regex("^((25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[1-9][0-9]?|0)\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[1-9][0-9]?|0)$").matches(this)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 判断当前字符串是否为IPv6地址格式。
|
|
|
|
+ *
|
|
|
|
+ * @return 如果字符串为有效的IPv6地址格式(包含在中括号内,如`[::1]`),返回true;否则返回false。
|
|
|
|
+ */
|
|
|
|
+fun String?.isIpv6(): Boolean {
|
|
|
|
+ if (this == null) return false
|
|
|
|
+ return Regex("^(?:[\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$|^(?:[\\da-fA-F]{1,4}:){1,7}:$|^:(?::[\\da-fA-F]{1,4}){1,7}$|^(?:[\\da-fA-F]{1,4}(?::[\\da-fA-F]{1,4}){0,5})?::(?:[\\da-fA-F]{1,4}(?::[\\da-fA-F]{1,4}){0,5})?$")
|
|
|
|
+ .matches(this)
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 隐藏字符串中间一部分字符,用于部分信息的脱敏显示。
|
|
* 隐藏字符串中间一部分字符,用于部分信息的脱敏显示。
|
|
*
|
|
*
|