go实践二十三 使用正则

编辑一个 testregexp.go 文件,内容如下

使用 go run testregexp.go 运行该文件即可

package main

import (
	"fmt"
	"regexp"
	"net/http"
	"io/ioutil"
	"strings"
)

/*
通过正则判断是否匹配
regexp包中含有三个函数用来判断是否匹配,如果匹配返回true,否则返回false

func Match(pattern string, b []byte) (matched bool, error error)
func MatchReader(pattern string, r io.RuneReader) (matched bool, error error)
func MatchString(pattern string, s string) (matched bool, error error)

面的三个函数实现了同一个功能,就是判断pattern是否和输入源匹配,匹配的话就返回true,如果解析正则出错则返回error。三个函数的输入源分别是byte slice、RuneReader和string。
*/


func main() {
	ip := "127.0.0.1"
	res := isip(ip)
	if !res{
		fmt.Println(ip," 不是ip")
	}else{
		fmt.Println(ip," 是ip")
	}

	ip = "127.0.0.1.0"
	res = isip(ip)
	if !res{
		fmt.Println(ip," 不是ip")
	}else{
		fmt.Println(ip," 是ip")
	}

	fmt.Println()

	vars := "1134"
	res = isnumber(vars)
	if !res {
		fmt.Println(vars," 不是数字")
	}else{
		fmt.Println(vars," 是数字")
	}

	vars = "13.2"
	res = isnumber(vars)
	if !res {
		fmt.Println(vars," 不是数字")
	}else{
		fmt.Println(vars," 是数字")
	}

	vars = ".234"
	res = isnumber(vars)
	if !res {
		fmt.Println(vars," 不是数字")
	}else{
		fmt.Println(vars," 是数字")
	}

	vars = "123abv"
	res = isnumber(vars)
	if !res {
		fmt.Println(vars," 不是数字")
	}else{
		fmt.Println(vars," 是数字")
	}

	//正则替换
	fmt.Println()
	fmt.Println("spiders")
	spiders()

	//正则查找
	fmt.Println()
	fmt.Println("regexpfind")
	regexpfind()

	//expend
	fmt.Println()
	fmt.Println("testexpend")
	testexpend()
}


//验证是不是ip地址
func isip(ip string) bool {
	regexp1 := `^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$`
	if m,_ := regexp.MatchString(regexp1,ip);!m{
		return false
	}
	return true
}

//验证数字
func isnumber(num string) bool{
	regexp1 := `^[0-9]+$`
	//判断是否整数
	if m,_ := regexp.MatchString(regexp1,num);!m{
		//判断是否浮点数
		regexp2 := `^[0-9]*\.[0-9]+$`
		if m,_ := regexp.MatchString(regexp2,num);!m {
			return false
		}else{
			return true
		}
	}
	return true
}

//正则替换字符串
func spiders(){
	resp,err := http.Get("http://www.baidu.com")
	if err != nil{
		fmt.Println("http get error.")
	}
	defer resp.Body.Close()
	body,err := ioutil.ReadAll(resp.Body)
	if err != nil{
		fmt.Println("http read error")
		return
	}

	src := string(body)
	//fmt.Println();
	//fmt.Println("src1",src);

	//将html标签全部替换成小写
	re,_ := regexp.Compile("\\<[\\S\\s]+?\\>")
	src = re.ReplaceAllStringFunc(src,strings.ToLower)

	//去除style
	re,_ = regexp.Compile(`<style([\s\S]*?)</style>`)
	src = re.ReplaceAllString(src,"")

	//去除script
	re,_ = regexp.Compile(`<script([\s\S]*?)</script>`)
	src = re.ReplaceAllString(src,"")

	//去除所有尖括号内的html代码,并换成换行符
	re,_ = regexp.Compile("\\<[\\S\\s]+?\\>")
	src = re.ReplaceAllString(src,"\n")

	//去除连续的换行符
	re,_ = regexp.Compile("\\s{2,}")
	src = re.ReplaceAllString(src,"\n")

	fmt.Println(strings.TrimSpace(src))
}

func regexpfind(){
	a := "i am learning go language"

	//正则匹配 a-z 字母 2-4 个
	re,_ := regexp.Compile("[a-z]{2,4}")

	//查找符合正则的第一个
	one := re.Find([]byte(a))
	fmt.Println("find:",string(one))

	//查找符合正则的所有slice ,n小于0表示返回全部符合的字符串,不然就是返回指定的长度
	//regexp.Compile(regexp).FindAll([]byte(string),n)
	all := re.FindAll([]byte(a),-1)
	fmt.Println("FindAll",all)

	//查找符合条件的index位置,开始位置和结束位置
	//regexp.Compile(regexp).FindIndex([]byte(string))
	index := re.FindIndex([]byte(a))
	fmt.Println("FindIndex",index)

	//查找符合条件的所有index 的位置, n同上
	//regexp.Compile(regexp).FindAllIndex([]byte(string),n)
	allindex := re.FindAllIndex([]byte(a),-1)
	fmt.Println("FindAllIndex",allindex)

	//正则匹配 am所有lang所有
	re2,_ := regexp.Compile("am(.*)lang(.*)")

	//查找Submatch, 返回数组,第一个元素是匹配的全部元素,第二个元素是第一个()里面的,第三个是第二个()里面的
	//下面的输出第一个元素是"am learning Go language"
	//第二个元素是"learning Go",注意保护空格的输出
	//第三个元素是"uage"
	submatch := re2.FindSubmatch([]byte(a))
	fmt.Println("FindSubmatch",submatch)
	for _,v := range submatch{
		fmt.Println(string(v))
	}

	//定义和上面的FindIndex一样
	submatchindex := re2.FindSubmatchIndex([]byte(a))
	fmt.Println(submatchindex)

	//FindAllSubmatch,查找所有符合条件的子匹配
	submatchall := re2.FindAllSubmatch([]byte(a),-1)
	fmt.Println(submatchall)

	//FindAllSubmatchIndex,查找所有字匹配的index
	submatchallindex := re2.FindAllSubmatchIndex([]byte(a),-1)
	fmt.Println(submatchallindex)
}

func testexpend(){
	src := []byte(`
		call hello alice
		hello bob
		call hello eve
	`)
	pat := regexp.MustCompile(`(?m)(call)\s+(?P<cmd>\w+)\s+(?P<arg>.+)\s*$`)
	res := []byte{}
	for _, s := range pat.FindAllSubmatchIndex(src, -1) {
		res = pat.Expand(res, []byte("$cmd('$arg')\n"), src, s)
	}
	fmt.Println(string(res))
}

参考:https://www.golang123.com/book/9?chapterID=180

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值