文章目录
正则表达式:
能使用 string、strings、strcnov 包函数解决的问题,首选使用库函数。 其次再选择正则表达式。
----字符:
“.”: 匹配任意一个字符
"[ ]": 匹配 [ ] 内任意一个字符。
“-”:指定范围: a-z、A-Z、0-9
"^": 取反。 使用在 [ ] 内部。[^xy]8
[[:digit:]] ——> 数字 == [0-9]
----字符测试:
package main
import (
"regexp"
"fmt"
)
func main() {
str := "abc a7c mfc cat aMc azc cba"
// 解析、编译正则表达式
//ret := regexp.MustCompile(`a.c`) // `` : 表示使用原生字符串
ret := regexp.MustCompile(`a[^0-9a-z]c`) // `` : 表示使用原生字符串
// 提取需要信息
alls := ret.FindAllStringSubmatch(str, -1)
fmt.Println("alls:", alls)
}
----小数测试:
package main
import (
"regexp"
"fmt"
)
func main() {
str := "3.14 123.123 .68 haha 1.0 abc 7. ab.3 66.6 123."
// 解析、编译正则表达式
//ret := regexp.MustCompile(`[0-9]+\.[0-9]+`)
//ret := regexp.MustCompile(`\d+\.\d+`)
ret := regexp.MustCompile(`\d\.\d`)
// 提取需要的信息
alls := ret.FindAllStringSubmatch(str, -1)
fmt.Println("alls:", alls)
}
-----次数:
“?”: 匹配 前面 单元出现 0-1次
“+”:匹配 前面 单元 出现 1-N次
“*”:匹配 前面 单元 出现 0-N次
“{N}”: 匹配 前面 单元 精确匹配 N 次
"{N,}": 匹配 前面 单元 至少匹配 N 次
"{N,M}": 匹配 前面 单元 匹配 N -- M 次。
---- 单元限定符:
“()”: 可以将一部分正则表达式,组成一个 单元,可以对该单元使用 数量限定符
Go语言使用正则:
---- 步骤:
1. 解析编译正则表达式:
MustCompile(str string) *Regexp
参数:正则表达式: 建议使用“反引号”—— ` `
返回值: 编译后的正则表达式 (结构体类型)
2. 提取需要的数据:
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
参数1:待匹配的字符串。
参数2:匹配次数。 -1 表匹配全部
返回值: 存储匹配结果的 [ ][ ]string
数组的每一个成员都有 string1 和 string2 两个元素。
string1:表示, 带有匹配参考项的字符串。 【0】
string2:表示,不包含匹配参考项的字符串内容。【1】
----- 提取网页标签数据:
举例: 提取 <div></div> 之中的数据
1) <div>(.*)</div> --> 可以提取div标签的内容
2) 对于 div 标签中 含有多行内容清空:
正则表达式:(?s:(.*?))
package main
import (
"regexp"
"fmt"
)
func main() {
str := `<html lang="zh-CN">
<head>
<title>Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<meta charset="utf-8">
<link rel="shortcut icon" href="/static/img/go.ico">
<link rel="apple-touch-icon" type="image/png" href="/static/img/logo2.png">
<meta name="author" content="polaris <polaris@studygolang.com>">
<meta name="keywords" content="中文, 文档, 标准库, Go语言,Golang,Go社区,Go中文社区,Golang中文社区,Go语言社区,Go语言学习,学习Go语言,Go语言学习园地,Golang 中国,Golang中国,Golang China, Go语言论坛, Go语言中文网">
<meta name="description" content="Go语言文档中文版,Go语言中文网,中国 Golang 社区,Go语言学习园地,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。分享 Go 语言知识,交流使用经验">
</head>
<title></title>
<div>hello regexp</div>
<div>hello 2</div>
<div>hello 890</div>
<div>hello 664</div>
<div>
2块钱啥时候还?
过了年再说吧!
刚买了车,没钱。。。
</div>
<body>身体</body>
<frameset cols="15,85">
<frame src="/static/pkgdoc/i.html">
<frame name="main" src="/static/pkgdoc/main.html" tppabs="main.html" >
<noframes>
</noframes>
</frameset>
</html>`
// 解析、编译正则表达式
//ret := regexp.MustCompile(`<div>(.*)</div>`)
ret := regexp.MustCompile(`<div>(?s:(.*?))</div>`)
// 提取需要的信息
alls := ret.FindAllStringSubmatch(str, -1)
fmt.Println("alls:", alls)
for _, one := range alls {
fmt.Println("one[0]=", one[0])
fmt.Println("one[1]=", one[1])
}
}