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) *Regexp
str
:欲匹配的正則表達式格式(模式)- 返回一個正則表達的對象
func (re *Regexp) FindAllString(s string, n int) []string
s
:被匹配的字符串(字符串格式)n
:滿足正則表達對象前n個字符串- n為-1時則返回全部滿足正則表達式的字符串
- 返回一個字符串陣列
1 | package main |
捕獲
- 捕獲(exp):匹配exp,並捕獲文本到自動命名的組裡
(?<name>exp)
:匹配exp,並捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp)
(?:exp)
:匹配exp,不捕獲匹配的文本,也不給此分組分配組號
- 其會捕獲到
()
中匹配的字符串並放置在字符串陣列中 func (re *Regexp)FindStringSubmatch(s string)[]string
s
:被匹配的字符串(字符串格式)- 返回一個字符串陣列
- 字符串陣列的第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