代码如下
package main
import (
"fmt"
"io/ioutil"
"regexp"
)
func main() {
// 读取文件内容
data, err := ioutil.ReadFile("text.txt")
if err != nil {
fmt.Println(err)
return
}
// 将文件内容转换为字符串
text := string(data)
// 定义正则表达式
reURL := regexp.MustCompile(`(http|ftp|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`)
reIP := regexp.MustCompile(`\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b`)
// 查找所有 URL 和 IP
urls := reURL.FindAllString(text, -1)
ips := reIP.FindAllString(text, -1)
// 去重
urlMap := make(map[string]bool)
for _, url := range urls {
urlMap[url] = true
}
ipMap := make(map[string]bool)
for _, ip := range ips {
ipMap[ip] = true
}
// 输出结果
fmt.Println("URLs:")
for url := range urlMap {
fmt.Println(url)
}
fmt.Println("IPs:")
for ip := range ipMap {
fmt.Println(ip)
}
}
从本地文件中读取文本,然后使用正则表达式来查找文本中的所有 URL 和 IP,并去重后输出结果。
ioutil.ReadFile 函数,它的作用是读取文件内容并将其转换为字节切片。它的用法如下:
data, err := ioutil.ReadFile(filename)
filename 参数是文件的路径,可以是相对路径或绝对路径。如果读取成功,data 变量将保存文件内容的字节切片,err 变量将为 nil;如果读取失败,err 变量将保存一个错误对象,data 变量的值将是未定义的。
regexp.MustCompile 函数,它的作用是编译正则表达式并返回一个正则表达式匹配器。它的用法如下:
regexp := regexp.MustCompile(pattern)
pattern 参数是正则表达式的字符串形式,它的语法和用法与其他语言的正则表达式类似。如果编译成功,regexp 变量将保存一个正则表达式匹配器;如果编译失败,程序将退出并打印错误信息。
FindAllString 方法,它的作用是在文本中查找所有与正则表达式匹配的字符串,并返回一个字符串切片。它的用法如下:
strings := regexp.FindAllString(text, n)
如果 n 参数为正数,则返回不超过 n 个匹配结果;如果 n 参数为负数,则返回所有匹配结果。如果没有找到任何匹配结果,则返回一个空切片。
golang map去重复
在这个例子中,我们使用make 函数创建了一个空的 map[string]bool 类型的 map,用于存储去重后的 URL。然后使用 for 循环遍历 urls 切片,对于每个 URL,将其作为键插入 map 中。
如果这个 URL 在 map 中已经存在,则不会重复插入,因为 map 中的键是唯一的。如果这个 URL 不存在,则会在 map 中新增一个键值对。
最后,我们输出 map 中的所有键,这样就可以得到所有去重后的 URL