本文地址: https://www.cnblogs.com/zichliang/p/17387436.html
Golang日庫(kù)合集:https://www.cnblogs.com/zichliang/category/2297320.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437876.html
簡(jiǎn)介
正則表達(dá)式是一種用來(lái)查詢、匹配或替換字符串的技術(shù)。你可以使用它來(lái)找到符合特定模式的文本、刪除或替換匹配的字符串。它可以用于各種編程語(yǔ)言和工具中,如Perl、Python、JavaScript、Java等等。
一句話概括就是,“正則表達(dá)式可以幫你快速、簡(jiǎn)便地處理需要查找、匹配或替換的文本內(nèi)容,它可以大大提高程序的效率?!?/p>
正則介紹
正則表達(dá)式通常可以分為以下幾個(gè)步驟:
- 定義正則表達(dá)式模式:即給出需要匹配或查找的文本規(guī)則,如匹配所有以"A"開(kāi)頭的單詞,模式可以是 "^A\w+"。
- 編譯正則表達(dá)式:將正則表達(dá)式模式編譯成程序可識(shí)別的格式。
- 指定匹配文本:輸入需要進(jìn)行匹配操作的文本,如一段英語(yǔ)文章。
- 進(jìn)行匹配操作:程序會(huì)根據(jù)輸入的正則表達(dá)式和匹配文本進(jìn)行匹配操作,搜索所有與正則表達(dá)式模式匹配的子串。
- 獲取匹配結(jié)果:輸出匹配到的所有子串,包括位置、長(zhǎng)度,或?qū)⑺鼈兲鎿Q成所需要的格式。
元字符
上文說(shuō)的第一步與第二步匹配特定字符或字符類型的字符在正則表達(dá)式中具有特殊含義。一般來(lái)說(shuō),它們都是特殊符號(hào)或字母,用于匹配某個(gè)字符類或執(zhí)行某種操作。
這里就不列舉了
推薦個(gè)網(wǎng)站: 里面包含了基本上所有的元字符: https://www.runoob.com/regexp/regexp-metachar.html
Golang中的正則
其實(shí)非常簡(jiǎn)單主要分為三步
- 正則( 針對(duì)字符串匹配規(guī)則)
- 元字符(基本上大同小異)
- 方法(特定語(yǔ)言有特定方法)
Golang 中常用的元字符:
- .:匹配任意單個(gè)字符,除了換行符和回車符。
- ^:匹配輸入字符串的開(kāi)始位置。
- $:匹配輸入字符串的結(jié)束位置。
- *:匹配前面的字符(包括字符類)零次或多次。
- +:匹配前面的字符(包括字符類)一次或多次。
- ?:匹配前面的字符(包括字符類)零次或一次。
- |:分隔兩個(gè)可選模式,匹配任意一個(gè)模式。
- []:匹配其中的任意一個(gè)字符??梢允褂枚虣M線表示范圍,如 [a-z] 表示匹配任意小寫(xiě)字母。
- \d:匹配任意一個(gè)數(shù)字字符,相當(dāng)于 [0-9]。
- \w:匹配任意一個(gè)字母、數(shù)字或下劃線,相當(dāng)于 [a-zA-Z0-9_]。
- \s:匹配任意一個(gè)空白字符,包括空格、制表符、換行符等。
Golang中的函數(shù)和方法介紹
在 Golang 中,標(biāo)準(zhǔn)庫(kù) regexp
提供了一系列正則操作函數(shù),下面是這些函數(shù)的簡(jiǎn)要介紹:
-
Compile(expr string) (*Regexp, error)
:將一個(gè)字符串編譯成一個(gè)正則表達(dá)式對(duì)象Regexp
。如果編譯失敗,會(huì)返回一個(gè)非nil
的錯(cuò)誤對(duì)象。 -
CompilePOSIX(expr string) (*Regexp, error)
:類似于Compile
函數(shù),但是將正則表達(dá)式解釋為 POSIX 語(yǔ)法。 -
MustCompile(expr string) *Regexp
:類似于Compile
函數(shù),但是在編譯失敗時(shí)會(huì)直接拋出一個(gè) panic。 -
MustCompilePOSIX(expr string) *Regexp
:類似于MustCompile
函數(shù),但是將正則表達(dá)式解釋為 POSIX 語(yǔ)法。 -
Match(pattern string, b []byte) (bool, error)
:判斷一個(gè)字節(jié)數(shù)組中是否包含指定的正則表達(dá)式。 -
MatchString(pattern string, s string) (bool, error)
:判斷一個(gè)字符串中是否包含指定的正則表達(dá)式。 -
MatchReader(pattern string, r io.RuneReader) (bool, error)
:類似于Match
函數(shù),但是適用于io.RuneReader
類型。 -
MatchRegexp(r *Regexp, s string) bool
:對(duì)一個(gè)字符串執(zhí)行已編譯的正則表達(dá)式對(duì)象Regexp
進(jìn)行匹配。 -
MatchReaderRegexp(r *Regexp, r io.RuneReader) bool
:類似于MatchRegexp
函數(shù),但是適用于io.RuneReader
類型。 -
QuoteMeta(s string) string
:將一個(gè)字符串中的元字符以外的所有字符都轉(zhuǎn)義,使它們成為字面量。
除此之外,Regexp
對(duì)象還提供了一系列操作方法,例如:
-
Find(b []byte) []byte
:返回第一個(gè)匹配的子字符串。 -
FindAll(b []byte, n int) [][]byte
:返回所有匹配的子字符串,n 表示最大匹配次數(shù)。 -
FindAllIndex(b []byte, n int) [][]int
:返回所有匹配的子字符串的起止索引,n 表示最大匹配次數(shù)。 -
FindIndex(b []byte) (loc []int)
:返回第一個(gè)匹配的子字符串的起止索引。 -
FindString(s string) string
:返回第一個(gè)匹配的子字符串。 -
FindAllString(s string, n int) []string
:返回所有匹配的子字符串,n 表示最大匹配次數(shù)。 -
FindAllStringIndex(s string, n int) [][]int
:返回所有匹配的子字符串的起止索引,n 表示最大匹配次數(shù)。 -
FindStringIndex(s string) (loc []int)
:返回第一個(gè)匹配的子字符串的起止索引。 -
FindAllSubmatch(b []byte, n int) [][][]byte
返回的是字節(jié)切片的切片的切片 -
FindAllSubmatchIndex(b []byte, n int) [][]int
返回所有匹配子串的開(kāi)始和結(jié)束的字符索引位置。 -
FindAllStringSubmatch(s string, n int) [][]string
返回的是字符串切片的切片的切片。 -
FindAllStringSubmatchIndex(s string, n int) [][]int
返回各個(gè)子串的開(kāi)始和結(jié)束的索引值, -
ReplaceAll(src []byte, repl []byte) []byte
:將 src 中的所有匹配項(xiàng)替換為 repl,返回替換后的結(jié)果。 -
ReplaceAllString(src, repl string) string
:類似于ReplaceAll
函數(shù),但是輸入輸出都是字符串類型。 -
Split(s string, n int) []string
:將 s 按照正則表達(dá)式分割,n 表示最大分割次數(shù)。 -
SplitN(s string, n int) []string
:類似于Split
函數(shù),但是只分割前 n 個(gè)子字符串。
這些函數(shù)和方法可以滿足我們對(duì)正則表達(dá)式進(jìn)行各種查詢、替換、分割等常見(jiàn)操作的需求。
Compile 和 MustCompile
在 Golang 中,我們可以使用 Compile 函數(shù)和 MustCompile 函數(shù)來(lái)將正則表達(dá)式字符串編譯為一個(gè) Regexp 對(duì)象。
這兩個(gè)函數(shù)的作用是相同的,都是將正則表達(dá)式字符串編譯成一個(gè)正則表達(dá)式對(duì)象,只不過(guò) MustCompile 函數(shù)在編譯失敗時(shí)會(huì)直接拋出一個(gè) panic。
Compile
// Compile 函數(shù)的使用方式
re, err := regexp.Compile(`\d+`)
if err != nil {
// 正則表達(dá)式編譯失敗
return
}
// 使用編譯后的正則表達(dá)式對(duì)象
fmt.Println(re.MatchString("123"))
結(jié)果
true
MustCompile
// MustCompile 函數(shù)的使用方式
re = regexp.MustCompile(`\d+`)
fmt.Println(re.MatchString("456"))
結(jié)果
true
FindAllSubmatch和FindAllStringSubmatch
FindAllSubmatch
方法是 Golang 中 Regexp 對(duì)象提供的一個(gè)方法。
用于在指定字符串中查找所有符合正則表達(dá)式規(guī)則的子字符串,并返回子字符串所對(duì)應(yīng)的分組信息及匹配位置。
其函數(shù)簽名如下:
func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte
func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int
FindAllSubmatch 和 FindAllStringSubmatch 方法都用于在字符串中查找所有匹配正則表達(dá)式的子字符串,它們返回的是一個(gè)包含所有匹配子串和索引位置的二維切片。
FindAllStringSubmatchIndex 方法返回一個(gè)二維的整數(shù)切片,每個(gè)子切片表示一次匹配,每個(gè)子切片中的兩個(gè)整數(shù)分別表示匹配子串在源字符串中的開(kāi)始和結(jié)束位置的索引。
FindAllSubmatchIndex 方法也返回一個(gè)二維的整數(shù)切片,不同的是,每個(gè)子切片中都包含一系列整數(shù),每?jī)蓚€(gè)整數(shù)表示匹配的一組子表達(dá)式在源字符串中的開(kāi)始和結(jié)束位置的索引。
其中,re 是一個(gè)正則表達(dá)式對(duì)象,b 是需要查找匹配的字節(jié)切片,n 表示最大匹配次數(shù),如果為 -1 則表示查找所有匹配項(xiàng)。
返回值是一個(gè)二維切片,每個(gè)元素都是一個(gè)切片,包含所有匹配到的子串的字節(jié)切片,以及子串出現(xiàn)的索引位置。
其實(shí)說(shuō)的還是有些籠統(tǒng)
例子
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
content := `111 aba 1024 bbb 2048 ccc aba aba`
pattern := `aba`
compile, _ := regexp.Compile(pattern)
results := compile.FindAllSubmatch([]byte(content), -1)
fmt.Println(compile.FindAllSubmatchIndex([]byte(content), -1))
for _, result := range results {
fmt.Println("FindAllSubmatch>>>>>", result)
fmt.Println("FindAllSubmatch>>>>>", result[0])
fmt.Println("FindAllSubmatch>>>>>", string(result[0]))
}
fmt.Println(strings.Repeat("*", 100))
results1 := compile.FindAllStringSubmatch(content, -1)
fmt.Println(compile.FindAllStringSubmatchIndex(content, -1))
for _, result := range results1 {
fmt.Println("FindAllStringSubmatch>>>>>", result)
fmt.Println("FindAllStringSubmatch>>>>>", result[0])
}
}
結(jié)果如下:
例子2:
如果我們需要正則提取網(wǎng)站該如何實(shí)現(xiàn)呢?
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
content := `<a target="_blank">京東</a> <a target="_blank">淘寶</a>`
pattern := `<a href="(.*?)" target="_blank">(.*?)</a>`
compile, _ := regexp.Compile(pattern)
results := compile.FindAllSubmatch([]byte(content), -1)
/*
[][][]byte
[]byte=""
// 一旦加了括號(hào)等于分了組 后面會(huì)向這個(gè)切片追加值,所以下文只要切片取第二個(gè)值就行了 多分組就以此類推
[
[<a target="_blank">京東</a>,https://www.jd.com,京東]
[<a target="_blank">淘寶</a>,https://www.taobao.com,淘寶]
]
*/
for _, result := range results {
fmt.Println(strings.Repeat("*", 100))
fmt.Println(string(result[0]), string(result[1]), string(result[2]))
}
}
結(jié)果文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-437876.html
本文地址: https://www.cnblogs.com/zichliang/p/17387436.html
Golang日庫(kù)合集:https://www.cnblogs.com/zichliang/category/2297320.html
到了這里,關(guān)于Golang每日一庫(kù)之regex的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!