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"