婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go語言正則表達式的使用詳解

Go語言正則表達式的使用詳解

熱門標簽:烏魯木齊人工電銷機器人系統 福州鐵通自動外呼系統 廣東語音外呼系統供應商 賺地圖標注的錢犯法嗎 地圖標注測試 濮陽自動外呼系統代理 澳門防封電銷卡 智能電銷機器人營銷 長沙ai機器人電銷

正則表達式是一種進行模式匹配和文本操縱的功能強大的工具。正則表達式靈活、易用,按照它的語法規則,隨需構造出的匹配模式就能夠從原始文本中篩選出幾乎任何你想要得到的字符組合。

準則

  • 默認是最短匹配,只要字符串滿足條件就返回。
  • 如果沒有匹配到,都是返回為nil。
  • 如果需要做最長匹配,調用Longest()函數。
  • 正則表達式功能:匹配(macth),查找(find)和替換(replace)。
  • 存在長度選擇的函數,傳入0的數字表示匹配全部。

使用regexp調用

Match,MatchReader和 MatchString

// 判斷b中是夠包含pattern能夠組成的任意字符串
func Match(pattern string, b []byte) (matched bool, err error)

// 判斷reader r中返回的字符串是否包含pattern能夠組成的任意字符串
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)

// 判斷字符串s中是否包含pattern能夠組成的任意字符串
func MatchString(pattern string, s string) (matched bool, err error)

Compile 和 MushCompile

func Compile(expr string) (*Regexp, error)
func MustCompile(str string) *Regexp

Compile :返回 Regexp 對象,方便調用指針函數。

MustCompile :同Compile,解析表達式失敗,會panic。

在匹配文本時,該正則表達式會盡可能早的開始匹配,并且在匹配過程中選擇回溯搜索到的第一個匹配結果。這種模式被稱為 leftmost-first ,另外一般情況下使用 MustCompile 即可。

使用regexp.Regexp對象來調用

Find 和 FindAll

  • func (re *Regexp) Find(b []byte) []byte
  • func (re *Regexp) FindAll(b []byte, n int) [][]byte

Find返回保管正則表達式re在b中的最左側的一個匹配結果的[]byte切片。如果沒有匹配到,會返回nil,最多匹配一個。

re := regexp.MustCompile(`foo.?`)
fmt.Printf("%q\n", re.Find([]byte(`seafood fool`)))
re := regexp.MustCompile(`foo.?`)
fmt.Printf("%q\n", re.FindAll([]byte(`seafood fool`), -1))

FindAll 功能與 Find 一樣,只是返回全部滿足條件的數據。

FindString 和 FindAllString

  • func (re *Regexp) FindString(s string) string
  • func (re *Regexp) FindAllString(s string, n int) []string

與 Find 和 FindAll 一樣,只是針對字符串string操作。

FindIndex 和 FindAllIndex

  • func (re *Regexp) FindIndex(b []byte) (loc []int)
  • func (re *Regexp) FindAllIndex(b []byte, n int) [][]int

FindIndex , 返回 b 中滿足匹配字符串部分的起始位置,同樣是**“leftmost-first”**原則,loc包含起止位置。如果沒有找到,直接返回 nil 。

FindAllIndex ,功能和 FindIndex 保持一致,只是匹配多個, n 決定了匹配的位置。

FindStringIndex 和 FindAllStringIndex

  • func (re *Regexp) FindStringIndex(s string) (loc []int)
  • func (re *Regexp) FindAllStringIndex(s string, n int) [][]int

與 FindIndex 和 FindAllIndex 使用方式類似,只是針對的是字符串string。

FindStringSubmatch 和 FindAllStringSubmatch

  • func (re *Regexp) FindStringSubmatch(s string) []string

FindStringSubmatch :采用左匹配原則,最多匹配一個,如果沒有的話,返回 nil 。對于返回的 []string ,分別標示匹配的字符串,子串。

re := regexp.MustCompile(`a(x*)b(y|z)c`)
fmt.Printf("%q\n", re.FindStringSubmatch("-axxxbyc-"))
fmt.Printf("%q\n", re.FindStringSubmatch("-abzc-"))

輸出結果:

["axxxbyc" "xxx" "y"]
["abzc" "" "z"]

  • func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string

和 FindStringSubmatch 使用類似,只是能顧選擇匹配的長度, -1 表示匹配到末尾。

re := regexp.MustCompile(`a(x*)b`)
fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-", -1))
fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-", -1))
fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-axb-", -1))
fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-ab-", -1))

輸出結果:

[["ab" ""]]
[["axxb" "xx"]]
[["ab" ""] ["axb" "x"]]
[["axxb" "xx"] ["ab" ""]]

FindSubmatchIndex 和 FindAllSubmatchIndex

  • func (re *Regexp) FindSubmatchIndex(b []byte) []int
  • func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int 計算子串在源串中的位置,已經存在 (x*) 等返回結果處理,如果沒有返回 nil 。

另外, index 返回為 左閉右開 的模式,示例中的 2,2 表示空字符串的意思。 并且,不會存在重合匹配的,比如說"-axxb-ab-"去匹配 a(x*)b ,不會存在第一個 a 和最后一個 b 結合的情況,如果使用 Longest 就會匹配最長的。

re := regexp.MustCompile(`a(x*)b`)
// Indices:
// 01234567 012345678
// -ab-axb- -axxb-ab-
fmt.Println(re.FindAllStringSubmatchIndex("-ab-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-axxb-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-ab-axb-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-axxb-ab-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-foo-", -1))

輸出結果:

[[1 3 2 2]] // 2 2 表示為空
[[1 5 2 4]]
[[1 3 2 2] [4 7 5 6]]
[[1 5 2 4] [6 8 7 7]]
[]


FindStringSubmatchIndex 和 FindAllStringSubmatchIndex
func (re *Regexp) FindStringSubmatchIndex(s string) []int
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int
和 FindSubmatchIndex , FindAllSubmatchIndex 保持一致。

Longest
func (re *Regexp) Longest() 獲取最長匹配的滿足條件的內容。
re := regexp.MustCompile(`a(|b)`)
fmt.Println(re.FindString("ab"))
re.Longest()
fmt.Println(re.FindString("ab"))

輸出結果:

a
ab

下面這種情況不會最長匹配。

re := regexp.MustCompile(`a(x*)b`)
re.Longest()
fmt.Println(re.FindString("-axxb-ab-")) // axxb,不會存在第一個a和最后一個b組合的過程。

Match,MatchString和MatchReader

  • func (re *Regexp) Match(b []byte) bool
  • func (re *Regexp) MatchString(s string) bool
  • func (re *Regexp) MatchReader(r io.RuneReader) bool

判斷 b , s 和 r 返回的數據是否滿足正則表達式,返回 true 或者 false 。

NumSubexp

  • func (re *Regexp) NumSubexp() int

返回分組的數量。

re0 := regexp.MustCompile(`a.`)
fmt.Printf("%d\n", re0.NumSubexp())

re := regexp.MustCompile(`(.*)((a)b)(.*)a`)
fmt.Println(re.NumSubexp())

輸出結果:

0
4

ReplaceAll 和 ReplaceAllString
func (re *Regexp) ReplaceAll(src, repl []byte) []byte
func (re *Regexp) ReplaceAllString(src, repl string) string
ReplaceAllString 與 ReplaceAll 使用方式相同。

re := regexp.MustCompile(`a(x*)b`)
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("T"))) 
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1"))) // $1表示匹配的第一個子串,這是ab的中間無字符串,所以$1為空,然后使用空去替換滿足正則表達式的部分。
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1W"))) // "$1W"等價與"$(1W)",值為空,將滿足條件的部分完全替換為空。
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("${1}W"))) // ${1}匹配(x*),保留。輸出-W-xxW-

輸出結果:

-T-T-
--xx-
---
-W-xxW-

s := "Hello World, 123 Go!"
//定義一個正則表達式reg,匹配Hello或者Go
reg := regexp.MustCompile(`(Hell|G)o`)

s2 := "2019-12-01,test"
//定義一個正則表達式reg2,匹配 YYYY-MM-DD 的日期格式
reg2 := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)

//最簡單的情況,用“T替換”"-ab-axxb-"中符合正則"a(x*)b"的部分
reg3 := regexp.MustCompile("a(x*)b")
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) // -T-T-

//${1}匹配"Hello World, 123 Go!"中符合正則`(Hell|G)`的部分并保留,去掉"Hello"與"Go"中的'o'并用"ddd"追加
rep1 := "${1}ddd"
fmt.Printf("%q\n", reg.ReplaceAllString(s, rep1)) // Hellddd World, 123 Gddd!

//首先,"2019-12-01,test"中符合正則表達式`(\d{4})-(\d{2})-(\d{2})`的部分是"2019-12-01",將該部分匹配'(\d{4})'的'2019'保留,去掉剩余部分
rep2 := "${1}"
fmt.Printf("%q\n", reg2.ReplaceAllString(s2,rep2)) // 2019,test

//首先,"2019-12-01,test"中符合正則表達式`(\d{4})-(\d{2})-(\d{2})`的部分是"2019-12-01",將該部分匹配'(\d{2})'的'12'保留,去掉剩余部分
 rep3 := "${2}"
fmt.Printf("%q\n", reg2.ReplaceAllString(s2,rep3)) // 12,test

//首先,"2019-12-01,test"中符合正則表達式`(\d{4})-(\d{2})-(\d{2})`的部分是"2019-12-01",將該部分匹配'(\d{2})'的'01'保留,去掉剩余部分,并追加"13:30:12"
rep4 := "${3}:13:30:12"
fmt.Printf("%q\n", reg2.ReplaceAllString(s2,rep4)) // 01:13:30:12,test
}

ReplaceAllFunc 和 ReplaceAllStringFunc

  • func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
  • func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string

將匹配出來滿足條件的 []byte 作為參數傳入函數中。

re := regexp.MustCompile(`[^aeiou]`)
fmt.Println(re.ReplaceAllStringFunc("seafood fool", strings.ToUpper))

兩者使用方式類似。

ReplaceAllLiteral 和 ReplaceAllLiteralString

  • func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte
  • func (re *Regexp) ReplaceAllLiteralString(src, repl string) string

匹配字面常量,不轉換。

re := regexp.MustCompile(`a(x*)b`)
fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "$1"))
fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "${1}"))

輸出結果:

-T-T-
-$1-$1-
-${1}-${1}-

關于 $1 說明:

Expand 和 ExpandString

  • func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte
  • func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte

Expand返回新生成的將template添加到dst后面的切片。在添加時,Expand會將template中的變量替換為從src匹配的結果。match應該是被FindSubmatchIndex返回的匹配結果起止位置索引。(通常就是匹配src,除非你要將匹配得到的位置用于另一個[]byte)

在template參數里,一個變量表示為格式如: $name 或 ${name} 的字符串,其中name是長度>0的字母、數字和下劃線的序列。一個單純的數字字符名如$1會作為捕獲分組的數字索引;其他的名字對應(?P...)語法產生的命名捕獲分組的名字。超出范圍的數字索引、索引對應的分組未匹配到文本、正則表達式中未出現的分組名,都會被替換為空切片。

$name格式的變量名,name會盡可能取最長序列: $1x 等價于 ${1x} 而非 ${1}x , $10 等價于 ${10} 而非 ${1}0 。因此 $name 適用在后跟空格/換行等字符的情況, ${name} 適用所有情況。

如果要在輸出中插入一個字面值 '$' ,在template里可以使用 $$ 。

其他示例

解析網址

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")
// 返回[]string{}數據類型
for _, param := range params {
 fmt.Println(param)
}

輸出結果:

http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html
2018
01
20
golang-goquery-examples-selector

總結

到此這篇關于Go語言正則表達式的使用詳解的文章就介紹到這了,更多相關Go正則表達式使用內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Java使用正則表達式檢索、替換String中特定字符和正則表達式的一切
  • python中使用正則表達式將所有符合條件的字段全部提取出來
  • layui 正則表達式驗證使用實例詳解
  • 正則表達式直接在EXCEL中使用的詳細步驟

標簽:貴陽 廣西 慶陽 調研邀請 西雙版納 太原 德州 阿克蘇

巨人網絡通訊聲明:本文標題《Go語言正則表達式的使用詳解》,本文關鍵詞  語言,正則,表達式,的,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言正則表達式的使用詳解》相關的同類信息!
  • 本頁收集關于Go語言正則表達式的使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品噜噜噜成人av农村| 97国产精品videossex| 国产中文字幕精品| 日韩一区二区三区精品视频 | 欧美专区日韩专区| 日韩一区二区三区免费看| 婷婷六月综合网| 91精品国产一区二区三区| 午夜精品一区在线观看| 日韩一卡二卡三卡国产欧美| 久久99日本精品| 中文字幕不卡三区| 91免费看片在线观看| 亚洲成人av福利| 欧美成人一区二区三区片免费 | 久久亚洲一级片| 国产成人av资源| 国产人成一区二区三区影院| 9久草视频在线视频精品| 亚洲午夜精品网| 久久婷婷国产综合精品青草 | 亚洲理论在线观看| 欧美日韩一区二区三区在线| 久久成人18免费观看| 国产精品美女久久久久aⅴ| 在线观看视频91| 久久精品国产亚洲一区二区三区| 久久精品国产亚洲高清剧情介绍| 精品一区二区在线免费观看| 国产欧美日韩麻豆91| 欧美午夜电影一区| 成人综合婷婷国产精品久久| 亚洲国产精品欧美一二99| 国产午夜精品在线观看| 欧美精品v国产精品v日韩精品 | 一本色道综合亚洲| 日本不卡一二三区黄网| 中文字幕一区在线观看视频| 欧美日韩国产经典色站一区二区三区 | 久久综合给合久久狠狠狠97色69| 国产精品亲子乱子伦xxxx裸| 97精品超碰一区二区三区| 亚洲超丰满肉感bbw| 国产精品每日更新| 26uuu亚洲婷婷狠狠天堂| 欧美群妇大交群中文字幕| 99视频国产精品| 成人精品鲁一区一区二区| 国产成a人亚洲精| 亚洲成人免费影院| 亚洲欧美日韩久久| 亚洲婷婷综合色高清在线| 久久久精品2019中文字幕之3| 午夜日韩在线观看| 国产精品久久久久久久岛一牛影视 | 欧美人伦禁忌dvd放荡欲情| 国产麻豆日韩欧美久久| 天天色天天操综合| 亚洲一区二区在线观看视频 | 国产精品久久久久久久蜜臀| 51精品秘密在线观看| 欧美无砖砖区免费| 欧美日韩高清在线| 欧美日韩一区中文字幕| 91久久国产最好的精华液| 91在线视频18| 色诱亚洲精品久久久久久| 99九九99九九九视频精品| 91在线高清观看| 日本乱人伦aⅴ精品| 色女孩综合影院| 欧美日韩精品专区| 欧美福利视频导航| 欧美一激情一区二区三区| 日韩欧美一级二级三级| 日韩欧美电影一区| 国产午夜一区二区三区| 亚洲激情第一区| 亚洲一区视频在线| 日韩高清中文字幕一区| 久久国产福利国产秒拍| 高潮精品一区videoshd| 在线免费视频一区二区| 欧美日韩一二区| 日韩欧美国产三级| 国产拍揄自揄精品视频麻豆| 自拍偷拍亚洲综合| 日韩精品电影在线| 国产伦精品一区二区三区免费| 国产日产欧美一区| 国产精品国产三级国产三级人妇| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲三级小视频| 亚洲国产精品影院| 国产在线一区观看| 不卡av免费在线观看| 3d动漫精品啪啪一区二区竹菊| 懂色av一区二区三区蜜臀| 波波电影院一区二区三区| 一本一本久久a久久精品综合麻豆| 久久97超碰色| 国产精品一区二区无线| 欧美专区在线观看一区| www国产精品av| 一区二区三区免费看视频| 美女www一区二区| 一本色道**综合亚洲精品蜜桃冫| 蜜桃av一区二区| jlzzjlzz亚洲女人18| 欧美日韩免费一区二区三区视频| 色综合久久综合网欧美综合网| 琪琪久久久久日韩精品| 菠萝蜜视频在线观看一区| 欧美一区二区三区视频在线观看| 99久久国产综合精品色伊| 欧美一区二区三区免费大片| 最近中文字幕一区二区三区| 理论片日本一区| 91国产免费观看| 亚洲视频综合在线| 成人在线视频一区| 久久久三级国产网站| 久久se精品一区二区| 91精品国产综合久久久蜜臀图片| 欧美喷水一区二区| 亚洲丝袜精品丝袜在线| 国产一区二区三区精品视频| 日韩午夜av电影| 日韩国产高清在线| 欧美一区二区在线不卡| 午夜成人免费视频| 欧美日韩一区二区三区四区五区 | 亚洲图片有声小说| 国产成人免费视| 久久久久久9999| 国产乱人伦精品一区二区在线观看 | 五月婷婷综合在线| 91亚洲精品久久久蜜桃网站| 中日韩av电影| 97久久精品人人做人人爽| 中文字幕亚洲一区二区va在线| 中文字幕五月欧美| 国产一区二区三区在线观看免费视频| 国产一区福利在线| 精品乱码亚洲一区二区不卡| 亚洲第一av色| 在线不卡一区二区| 久草精品在线观看| 国产日韩精品一区| 99久久精品国产精品久久| 亚洲欧美激情小说另类| 欧美丝袜丝交足nylons图片| 亚洲大片精品永久免费| 91精品国产黑色紧身裤美女| 蜜臀av国产精品久久久久| 欧美精品一区二区在线播放| 国产福利精品导航| 一区二区三区在线观看视频 | 蜜桃91丨九色丨蝌蚪91桃色| 欧美裸体bbwbbwbbw| 美女视频黄免费的久久 | 日本不卡在线视频| 欧美一区二区在线不卡| 久88久久88久久久| 亚洲欧洲色图综合| 8x福利精品第一导航| 国产精品一区二区三区四区| 亚洲精品午夜久久久| 日韩精品专区在线| 99热精品一区二区| 强制捆绑调教一区二区| 亚洲欧美日韩一区二区三区在线观看| 一区二区免费视频| 欧美一区二区啪啪| 成人99免费视频| 午夜精品久久久| 国产精品毛片大码女人| 日韩亚洲欧美成人一区| 99精品国产一区二区三区不卡| 精品福利在线导航| 91网址在线看| 国精产品一区一区三区mba桃花| 欧美视频一二三区| 狠狠色狠狠色综合| 亚洲成人一区二区在线观看| 国产女同互慰高潮91漫画| 日韩一区二区三区电影在线观看| 亚洲美腿欧美偷拍| 久久亚洲私人国产精品va媚药| 日本vs亚洲vs韩国一区三区二区| 国产成人日日夜夜| 亚洲风情在线资源站| 成人免费小视频| 国产欧美日韩另类视频免费观看| 激情欧美日韩一区二区| 亚洲va中文字幕| 国产精品激情偷乱一区二区∴| 久久精品99国产国产精| 艳妇臀荡乳欲伦亚洲一区| 欧美极品aⅴ影院|