Golang使用正则表达式捕获子表达式

参考文档: https://blog.51cto.com/u_15274085/2918652

正则匹配并且可以捕获到()这个里面的子表达式的值,linux的grep命令没办法捕获子表达式的值,只能获取到整条正则匹配的内容

package main

import (
	"fmt"
	"regexp"
)

func main() {
	str := `(.*?)(\d+)(.*?)\d(.*)\d`
	r := regexp.MustCompile(str)
	strArr := r.FindStringSubmatch("tao123shi5han567")

	for _, s := range strArr {
		fmt.Println(s)
	}
}

输出:

tao123shi5han567
tao
123
shi
han56

上面的正则中验证了.*是贪婪 .*?是非贪婪 ,下面匹配的字符串切片第一条是整条数据,后面的每一个对应正则括号里捕获的内容。

FindAllString查找匹配字符

.*? 非贪婪:

package main

import (
	"fmt"
	"regexp"
)

func main() {
	s := "Hello World! Held! world  Held! Hello xxx! Hello yy! Hello yyd!"
	r := regexp.MustCompile("Hello (.*?)d!")
	rs := r.FindAllString(s, -1)
	for _, r := range rs {
		fmt.Println(r)
	}
}

输出:

Hello World!
Hello xxx! Hello yy! Hello yyd!

.*贪婪

package main

import (
	"fmt"
	"regexp"
)

func main() {
	s := "Hello World! Held! world  Held! Hello xxx! Hello yy! Hello yyd!"
	r := regexp.MustCompile("Hello (.*)d!")
	rs := r.FindAllString(s, -1)
	for _, r := range rs {
		fmt.Println(r)
	}
}

输出:

Hello World! Held! world  Held! Hello xxx! Hello yy! Hello yyd!

示例

提取url

package main

import (
	"fmt"
	"regexp"
)

func main() {
	s := `video: [["http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_8.mp4","video\/mp4","1080p"], ["https:\/\/avideos.5min.com\/\/94\/5180094\/518009387_4.mp4","video\/mp4","720p"],["http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_2.mp4","video\/mp4","480p"]]    };`
	r := regexp.MustCompile(`https?:(.*?)"`)
	rs := r.FindAllString(s, -1)
	fmt.Println(len(rs))
	for _, r := range rs {
		fmt.Println(r)
	}
}

输出:

3
http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_8.mp4"
https:\/\/avideos.5min.com\/\/94\/5180094\/518009387_4.mp4"
http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_2.mp4"

示例:

package main

import (
	"fmt"
	"regexp"
)

func main() {
	s := `video: [["http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_8.mp4","video\/mp4","1080p"], ["https:\/\/avideos.5min.com\/\/94\/5180094\/518009387_4.mp4","video\/mp4","720p"],["http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_2.mp4","video\/mp4","480p"]]    };`
	r := regexp.MustCompile(`https?:(.*)"`)
	rs := r.FindAllString(s, -1)
	fmt.Println(len(rs))
	for _, r := range rs {
		fmt.Println(r)
	}
}

输出:

1
http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_8.mp4","video\/mp4","1080p"], ["https:\/\/avideos.5min.com\/\/94\/5180094\/518009387_4.mp4","video\/mp4","720p"],["http:\/\/avideos.5min.com\/\/94\/5180094\/518009387_2.mp4","video\/mp4","480p"