package main

import (
	"fmt"
	"net"
	"regexp"
)

func Ipv6PatternStr(data string) []net.IP {
	var ips []net.IP
	// 使用正则表达式匹配以240开头,可能包含::的IPv6地址部分
	// 注意:这个正则表达式不会确保整个IPv6地址的合法性,只是匹配部分字符串
	ipv6Pattern := `240[0-9a-fA-F]+(:[0-9a-fA-F]+)*(::([0-9a-fA-F]+:)*[0-9a-fA-F]+)?`
	re := regexp.MustCompile(ipv6Pattern)

	// 查找所有匹配的IPv6地址部分
	matches := re.FindAllString(data, -1)

	// 输出结果
	for _, match := range matches {
		ip := net.ParseIP(match)
		if ip != nil {
			ips = append(ips, ip)
		}
	}
	return ips
}
func main() {
	// 假设这是从某个源获取的数据字符串
	data := `eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000  
	inet6 240e:350:8947:c401::3bf/128 scope global dynamic noprefixroute   
	   valid_lft 2729sec preferred_lft 2729sec  
	inet6 240e:350:8947:c401:8c92:99ff:fe1f:eaaf/64 scope global dynamic mngtmpaddr noprefixroute   
	   valid_lft 2728sec preferred_lft 2728sec  
	inet6 fe80::8c92:99ff:fe1f:eacf/64 scope link   
	   valid_lft forever preferred_lft forever`

	ips := Ipv6PatternStr(data)
	if len(ips) == 0 {
		fmt.Println("No IPv6 address found")
		return
	}
	fmt.Println("IPv6 addresses found:")
	for _, ip := range ips {
		fmt.Println(ip)
	}
}

效果如下

PS C:\Users\Y\GolandProjects\tt> go run .\main.go
IPv6 addresses found:
240e:350:8947:c401::3bf
240e:350:8947:c401:8c92:99ff:fe1f:eaaf
PS C:\Users\Y\GolandProjects\tt>