文章目录

正则表达式:

能使用 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])
	}
}