Go

Go 的 Match 比對

July 13, 2022

Go 的 regexp 套件提供的規則表示式的支援,至於可使用的規則表示式,在 regexp/syntax 有說明。

撰寫規則表示式

在 Go 中要撰寫規則表示式,使用反引號(`)是比較方便的做法,這樣就不用轉譯 \

詮譯字元在規則表示式中有特殊意義,例如 $ ^ * ( ) + = { } [ ] | \ : . ? 等,若要比對這些字元,則必須加上轉義(Escape)符號,這時可以使用 regexpQuoteMeta 函式來代勞:

func QuoteMeta(s string) string

例如:

fmt.Println(regexp.QuoteMeta(`main.exe`)) // main\.exe

regexp 套件中提供其他函式,主要就是比對來源中,是否有符合規則表示式的部份,來源可以是 []byteio.RuneReader 或者是 string,比對結果會是布林值,若是規則表示式有誤,錯誤就不會是 nil

func Match(pattern string, b []byte) (matched bool, err error)
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)
func MatchString(pattern string, s string) (matched bool, err error)

例如:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    matched, err := regexp.MatchString(`\d{3}`, "Kaohsiung 803, Road 12")
    fmt.Println(matched, err)
    matched, err = regexp.MatchString(`\d{4}-\d{6}`, "0970-168168")
    fmt.Println(matched, err)
    matched, err = regexp.MatchString(`\d{4}-\d{6}`, "Phone: 0970-168168")
    fmt.Println(matched, err)
}

嵌入旗標

可以在規則表示式中使用嵌入旗標表示法(Embedded Flag Expression)。例如 (?i)dog,表示不區分大小寫,若想對特定分組嵌入旗標,可以使用 (?i:dog) 這樣的語法。

至於 Go 中可用的 POSIX 字元類:

  • [[:alnum:]]:字母與數字(等於 [0-9A-Za-z]
  • [[:alpha:]]:字母(等於 [A-Za-z]
  • [[:ascii:]]:ASCII(等於 [\x00-\x7F]
  • [[:blank:]]:空白或 Tab(等於 [\t ]
  • [[:cntrl:]]:控制字元(等於 [\x00-\x1F\x7F]
  • [[:digit:]]:數字(等於 [0-9]
  • [[:graph:]]:可見字元(等於 [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_{|}~]`)
  • [[:lower:]]:小寫字母(等於 [a-z]
  • [[:print:]]:可列印字元(等於 [ -~][ [:graph:]]
  • [[:punct:]]:標點符號(等於 [!-/:-@[-{-~]`)
  • [[:space:]]:全部的空白(等於 [\t\n\v\f\r ]
  • [[:upper:]]:大寫(等於 [A-Z]
  • [[:word:]]:單字字元(等於 [0-9A-Za-z_]
  • [[:xdigit:]]:十六進位數字(等於 [0-9A-Fa-f]

分享到 LinkedIn 分享到 Facebook 分享到 Twitter