最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言正則表達(dá)式的使用詳解

 更新時(shí)間:2020年03月01日 08:58:11   作者:大漠胡蘿卜  
正則表達(dá)式是一種進(jìn)行模式匹配和文本操縱的功能強(qiáng)大的工具。這篇文章主要介紹了Go正則表達(dá)式使用,本文給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

準(zhǔn)則

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

使用regexp調(diào)用

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 對(duì)象,方便調(diào)用指針函數(shù)。

MustCompile :同Compile,解析表達(dá)式失敗,會(huì)panic。

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

使用regexp.Regexp對(duì)象來調(diào)用

Find 和 FindAll

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

Find返回保管正則表達(dá)式re在b中的最左側(cè)的一個(gè)匹配結(jié)果的[]byte切片。如果沒有匹配到,會(huì)返回nil,最多匹配一個(gè)。

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 一樣,只是返回全部滿足條件的數(shù)據(jù)。

FindString 和 FindAllString

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

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

FindIndex 和 FindAllIndex

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

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

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

FindStringIndex 和 FindAllStringIndex

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

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

FindStringSubmatch 和 FindAllStringSubmatch

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

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

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

輸出結(jié)果:

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

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

和 FindStringSubmatch 使用類似,只是能顧選擇匹配的長(zhǎng)度, -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))

輸出結(jié)果:

[["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 計(jì)算子串在源串中的位置,已經(jīng)存在 (x*) 等返回結(jié)果處理,如果沒有返回 nil 。

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

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))

輸出結(jié)果:

[[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() 獲取最長(zhǎng)匹配的滿足條件的內(nèi)容。
re := regexp.MustCompile(`a(|b)`)
fmt.Println(re.FindString("ab"))
re.Longest()
fmt.Println(re.FindString("ab"))

輸出結(jié)果:

a
ab

下面這種情況不會(huì)最長(zhǎng)匹配。

re := regexp.MustCompile(`a(x*)b`)
re.Longest()
fmt.Println(re.FindString("-axxb-ab-")) // axxb,不會(huì)存在第一個(gè)a和最后一個(gè)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 返回的數(shù)據(jù)是否滿足正則表達(dá)式,返回 true 或者 false 。

NumSubexp

  • func (re *Regexp) NumSubexp() int

返回分組的數(shù)量。

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

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

輸出結(jié)果:

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表示匹配的第一個(gè)子串,這是ab的中間無字符串,所以$1為空,然后使用空去替換滿足正則表達(dá)式的部分。
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1W"))) // "$1W"等價(jià)與"$(1W)",值為空,將滿足條件的部分完全替換為空。
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("${1}W"))) // ${1}匹配(x*),保留。輸出-W-xxW-

輸出結(jié)果:

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

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

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

//最簡(jiǎn)單的情況,用“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á)式`(\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á)式`(\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á)式`(\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 作為參數(shù)傳入函數(shù)中。

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

匹配字面常量,不轉(zhuǎn)換。

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}"))

輸出結(jié)果:

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

關(guān)于 $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后面的切片。在添加時(shí),Expand會(huì)將template中的變量替換為從src匹配的結(jié)果。match應(yīng)該是被FindSubmatchIndex返回的匹配結(jié)果起止位置索引。(通常就是匹配src,除非你要將匹配得到的位置用于另一個(gè)[]byte)

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

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

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

其他示例

解析網(wǎng)址

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{}數(shù)據(jù)類型
for _, param := range params {
 fmt.Println(param)
}

輸出結(jié)果:

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

總結(jié)

到此這篇關(guān)于Go語言正則表達(dá)式的使用詳解的文章就介紹到這了,更多相關(guān)Go正則表達(dá)式使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 多階段構(gòu)建優(yōu)化Go?程序Docker鏡像

    多階段構(gòu)建優(yōu)化Go?程序Docker鏡像

    這篇文章主要為大家介紹了多階段構(gòu)建優(yōu)化Go?程序Docker鏡像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • golang通過http訪問外部網(wǎng)址的操作方法

    golang通過http訪問外部網(wǎng)址的操作方法

    這篇文章主要介紹了golang通過http訪問外部網(wǎng)址的操作方法,分為?get方式訪問外部的接口,Post方式請(qǐng)求外部接口,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • golang中日期操作之日期格式化及日期轉(zhuǎn)換

    golang中日期操作之日期格式化及日期轉(zhuǎn)換

    在編程中,程序員會(huì)經(jīng)常使用到日期相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于golang中日期操作之日期格式化及日期轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Golang官方限流器庫實(shí)現(xiàn)限流示例詳解

    Golang官方限流器庫實(shí)現(xiàn)限流示例詳解

    這篇文章主要為大家介紹了Golang官方限流器庫使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • VSCode Golang dlv調(diào)試數(shù)據(jù)截?cái)鄦栴}及處理方法

    VSCode Golang dlv調(diào)試數(shù)據(jù)截?cái)鄦栴}及處理方法

    這篇文章主要介紹了VSCode Golang dlv調(diào)試數(shù)據(jù)截?cái)鄦栴},本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • go內(nèi)存緩存BigCache封裝Entry源碼解讀

    go內(nèi)存緩存BigCache封裝Entry源碼解讀

    這篇文章主要為大家介紹了go內(nèi)存緩存BigCache封裝Entry源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 詳解Go語言各種常見類型的默認(rèn)值和判空方法

    詳解Go語言各種常見類型的默認(rèn)值和判空方法

    本文主要介紹了詳解Go語言各種常見類型的默認(rèn)值和判空方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • go語言net包rpc遠(yuǎn)程調(diào)用的使用示例

    go語言net包rpc遠(yuǎn)程調(diào)用的使用示例

    本篇文章主要介紹了go語言net包rpc遠(yuǎn)程調(diào)用的使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Go常用技能日志log包創(chuàng)建使用示例

    Go常用技能日志log包創(chuàng)建使用示例

    這篇文章主要為大家介紹了Go常用技能日志log包創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go實(shí)現(xiàn)分布式系統(tǒng)高可用限流器實(shí)戰(zhàn)

    Go實(shí)現(xiàn)分布式系統(tǒng)高可用限流器實(shí)戰(zhàn)

    這篇文章主要為大家介紹了Go實(shí)現(xiàn)分布式系統(tǒng)高可用限流器實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

肥西县| 监利县| 泌阳县| 肥西县| 星子县| 钟山县| 文成县| 潮安县| 温宿县| 玉树县| 乐东| 磐安县| 曲松县| 保定市| 姚安县| 长岭县| 临沂市| 湛江市| 时尚| 郎溪县| 许昌县| 中西区| 即墨市| 塘沽区| 白山市| 阿坝县| 沙河市| 桦南县| 洛隆县| 永济市| 克什克腾旗| 新津县| 剑阁县| 襄垣县| 天镇县| 巴楚县| 原阳县| 静安区| 安岳县| 虹口区| 天长市|