Introduction
- 正則表達式常用來處理字符串的匹配
- Go語言標準庫內建提供了regexp包,來處理正則表達式的問題
正則表達式規則
匹配字符
.:匹配除換行符以外的任意字符\w:匹配字母或數字或下劃線或漢字\s:匹配任意的空白符號\d:匹配數字\b:匹配單詞的開始或結束^:匹配字符串的開始$:匹配字符串的結束匹配數量
*:重複零次或更多次+:重複一次或更多次?:重複零次或一次{n}:重複n次{n,}:重複n次或更多次{n,m}:重複n到m次
Golang中的正則匹配
是否匹配到該字符串
- 使用
Match函數來進行匹配func Match(pattern string, b []byte)(matched bool, err error)pattern: 欲匹配的格式(模式)b: 被匹配的字符串(須轉換成[]byte類型)
- 使用
MatchString函數進行匹配func MatchString(pattern string, s string)(matched bool, err error)s:被匹配的字符串(字符串格式)
1 | package main |
Result
1 | match: false |
返回匹配到的字符串
以下兩函式常搭配一起使用
func MustCompile(str string) *Regexpstr:欲匹配的正則表達式格式(模式)- 返回一個正則表達的對象
func (re *Regexp) FindAllString(s string, n int) []strings:被匹配的字符串(字符串格式)n:滿足正則表達對象前n個字符串- n為-1時則返回全部滿足正則表達式的字符串
- 返回一個字符串陣列
1 | package main |
捕獲
- 捕獲(exp):匹配exp,並捕獲文本到自動命名的組裡
(?<name>exp):匹配exp,並捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp)(?:exp):匹配exp,不捕獲匹配的文本,也不給此分組分配組號
- 其會捕獲到
()中匹配的字符串並放置在字符串陣列中 func (re *Regexp)FindStringSubmatch(s string)[]strings:被匹配的字符串(字符串格式)- 返回一個字符串陣列
- 字符串陣列的第0個值為匹配到的字符串
- 第1個值之後為欲捕獲
()中的字符串1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package main
import (
"fmt"
"regexp"
)
func main(){
flysnowRegexp := regexp.MustCompile(`^http://www.flysnow.org/([\d]{4})/([\d]{2})/([\d]{2})/([\w-]+).html$`)
params := flysnowRegexp.FindStringSubmatch("http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html")
fmt.Println("年份为:"+params[1])
fmt.Println("月份为:"+params[2])
fmt.Println("天数为:"+params[3])
fmt.Println("文章名为:"+params[4])
}
Result
1 | 年份为:2018 |
Reference
https://www.flysnow.org/2018/02/09/go-regexp-extract-text.html