Go初識-正則表達式

Introduction

  • 正則表達式常用來處理字符串的匹配
  • Go語言標準庫內建提供了regexp包,來處理正則表達式的問題

正則表達式規則

匹配字符

  • .:匹配除換行符以外的任意字符
  • \w:匹配字母或數字或下劃線或漢字
  • \s:匹配任意的空白符號
  • \d:匹配數字
  • \b:匹配單詞的開始或結束
  • ^:匹配字符串的開始
  • $:匹配字符串的結束

    匹配數量

  • *:重複零次或更多次
  • +:重複一次或更多次
  • ?:重複零次或一次
  • {n}:重複n
  • {n,}:重複n次或更多次
  • {n,m}:重複nm

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"regexp"
)

func main(){
var s = "He"
matchbool,err := regexp.MatchString("[a-zA-Z]{3}",s)
if err != nil{
panic("wow!!")
}
fmt.Println("match:",matchbool)
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"regexp"
)

func main(){
var s = "Hello World"

re := regexp.MustCompile("\\w{3}") //填入欲匹配的正則表達式(有斜槓時須轉譯)
result := re.FindAllString(s,-1)
fmt.Println(result)
}

捕獲

  • 捕獲(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
        16
        package 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
2
3
4
年份为:2018
月份为:01
天数为:20
文章名为:golang-goquery-examples-selector

Reference

https://www.flysnow.org/2018/02/09/go-regexp-extract-text.html