工作需要用到Golang使用正则匹配文档或字段中IP或者域名,并去重,返回切片
写了一个小方法,记录一下
IP正则
[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}
域名正则
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z]{0,62})\.?
Golang实现?
//匹配文档中的IP字段
func RegexpIp(str string) []string {
reg, _ := regexp.Compile(`[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}`)
s := reg.FindAllString(str, -1)
sort.Strings(s)
return removeDuplicates(s)
}
//匹配文档中的DNS字段
func RegexpDns(str string) []string {
reg, err := regexp.Compile(`[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z]{0,62})\.?`)
if err != nil {
log.Println("RegexpDns err:", err)
}
s := reg.FindAllString(str, -1)
sort.Strings(s)
return removeDuplicatesDns(s)
}
//去除重复字符串和空格Ip限定
func removeDuplicates(a []string) (ret []string) {
a_len := len(a)
for i := 0; i < a_len; i++ {
if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 {
continue
}
if validIPAddress(net.ParseIP(string(a[i]))) {
continue
}
ret = append(ret, a[i])
}
return
}
//去除重复字符串和空格
func removeDuplicatesDns(a []string) (ret []string) {
a_len := len(a)
for i := 0; i < a_len; i++ {
if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 {
continue
}
ret = append(ret, a[i])
}
return
}
//判断是否为IP且排除内网IP
func validIPAddress(ip net.IP) bool {
if ip.IsLoopback() {
return true
}
ip4 := ip.To4()
if ip4 == nil {
return true
}
return ip4[0] == 10 || // 10.0.0.0/8
(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || // 172.16.0.0/12
(ip4[0] == 169 && ip4[1] == 254) || // 169.254.0.0/16
(ip4[0] == 192 && ip4[1] == 168) // 192.168.0.0/16
}
|