GO手写网络爬虫二(正则表达式匹配)

本篇主要演示一下GO用正则表达式匹配文本信息的用法,为后面的爬虫做准备工作:

代码中已有详细的注释,直接贴上可执行的代码:

package main

import (
	"fmt"
	"regexp"
)

const text  = `arno's email is [email protected]
				lisa's email is [email protected]
				lucas's email is [email protected]
				alfred's email is [email protected]
`
func main() {
	//正则表达式解析
	//[0-9a-zA-Z]   表示0-9或a-z或A-Z中的一个或多个字符
	//[0-9a-zA-Z]+  表示一个或多个

	//@[0-9a-zA-Z]+  表示一个@与0-9或a-z或A-Z中的一个或多个字符
	//\.             表示 . 因为.是正则保留字符,它表示任意字符,如果想用来单纯的表示字符.  , 需要用转意符\
	r := regexp.MustCompile(`[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[0-9a-zA-Z]+`)

	//匹配所有满足正则的文本
	matchs := r.FindAllString(text,-1)
	fmt.Println("match list 1 : ",matchs)


	//[email protected]这里输出有点问题,把.cn给漏掉了
	//分析,应该允许@后面重复出现   [0-9a-zA-Z.]+  并以 \.[0-9a-zA-Z]+ 结尾似乎就满足我们的需求了,现试一下吧
	r = regexp.MustCompile(`[0-9a-zA-Z]+@[0-9a-zA-Z.]+\.[0-9a-zA-Z]+`)
	matchs = r.FindAllString(text,-1)
	fmt.Println("match list 2 : ",matchs)

	//只想提取邮件的名称怎么办呢?
	//分两步: 1,把想提取的子串用()给括起来 ; 2,用r.FindAllStringSubmatch(text,-1)来匹配
	r = regexp.MustCompile(`([0-9a-zA-Z]+)@([0-9a-zA-Z.]+\.[0-9a-zA-Z]+)`)
	subMatchs := r.FindAllStringSubmatch(text,-1)
	fmt.Println("subMatch list 2 : ",subMatchs)

	//匹配一个满足正则表达式的词
	match := r.FindString(text)
	fmt.Println(match)
}

正则好用且强大,功能远不止于本篇所介绍的这些,本爬虫也主要利用正则表达式来完成网页的解析工作。
更多正则表达式语法参见:http://www.runoob.com/regexp/regexp-tutorial.html

另外说明一下,GO有一些开源的爬虫框架的,但是这里用框架来实现就失去了很多趣味性。

你可能感兴趣的:(golang)