日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go的Regexp

發布時間:2024/9/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go的Regexp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://my.oschina.net/kuerant/blog/199146?

Golang學習 - regexp 包------------------------------------------------------------// 函數// 判斷在 b(s、r)中能否找到 pattern 所匹配的字符串 func Match(pattern string, b []byte) (matched bool, err error) func MatchString(pattern string, s string) (matched bool, err error) func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)// 將 s 中的正則表達式元字符轉義成普通字符。 func QuoteMeta(s string) string------------------------------// 示例:MatchString、QuoteMeta func main() {pat := `(((abc.)def.)ghi)`src := `abc-def-ghi abc+def+ghi`fmt.Println(regexp.MatchString(pat, src))// true <nil>fmt.Println(regexp.QuoteMeta(pat))// \(\(\(abc\.\)def\.\)ghi\) }------------------------------------------------------------// Regexp 代表一個編譯好的正則表達式,我們這里稱之為正則對象。正則對象可以 // 在文本中查找匹配的內容。 // // Regexp 可以安全的在多個例程中并行使用。 type Regexp struct { ... }------------------------------// 編譯// 將正則表達式編譯成一個正則對象(使用 PERL 語法)。 // 該正則對象會采用“leftmost-first”模式。選擇第一個匹配結果。 // 如果正則表達式語法錯誤,則返回錯誤信息。 func Compile(expr string) (*Regexp, error)// 將正則表達式編譯成一個正則對象(正則語法限制在 POSIX ERE 范圍內)。 // 該正則對象會采用“leftmost-longest”模式。選擇最長的匹配結果。 // POSIX 語法不支持 Perl 的語法格式:\d、\D、\s、\S、\w、\W // 如果正則表達式語法錯誤,則返回錯誤信息。 func CompilePOSIX(expr string) (*Regexp, error)// 功能同上,但會在解析失敗時 panic func MustCompile(str string) *Regexp func MustCompilePOSIX(str string) *Regexp// 讓正則表達式在之后的搜索中都采用“leftmost-longest”模式。 func (re *Regexp) Longest()// 返回編譯時使用的正則表達式字符串 func (re *Regexp) String() string// 返回正則表達式中分組的數量 func (re *Regexp) NumSubexp() int// 返回正則表達式中分組的名字 // 第 0 個元素表示整個正則表達式的名字,永遠是空字符串。 func (re *Regexp) SubexpNames() []string// 返回正則表達式必須匹配到的字面前綴(不包含可變部分)。 // 如果整個正則表達式都是字面值,則 complete 返回 true。 func (re *Regexp) LiteralPrefix() (prefix string, complete bool)------------------------------// 示例:第一匹配和最長匹配 func main() {b := []byte("abc1def1")pat := `abc1|abc1def1`reg1 := regexp.MustCompile(pat) // 第一匹配reg2 := regexp.MustCompilePOSIX(pat) // 最長匹配fmt.Printf("%s\n", reg1.Find(b)) // abc1fmt.Printf("%s\n", reg2.Find(b)) // abc1def1b = []byte("abc1def1")pat = `(abc|abc1def)*1`reg1 = regexp.MustCompile(pat) // 第一匹配reg2 = regexp.MustCompilePOSIX(pat) // 最長匹配fmt.Printf("%s\n", reg1.Find(b)) // abc1fmt.Printf("%s\n", reg2.Find(b)) // abc1def1 }------------------------------// 示例:正則信息 func main() {pat := `(abc)(def)(ghi)`reg := regexp.MustCompile(pat)// 獲取正則表達式字符串fmt.Println(reg.String()) // (abc)(def)(ghi)// 獲取分組數量fmt.Println(reg.NumSubexp()) // 3fmt.Println()// 獲取分組名稱pat = `(?P<Name1>abc)(def)(?P<Name3>ghi)`reg = regexp.MustCompile(pat)for i := 0; i <= reg.NumSubexp(); i++ {fmt.Printf("%d: %q\n", i, reg.SubexpNames()[i])}// 0: ""// 1: "Name1"// 2: ""// 3: "Name3"fmt.Println()// 獲取字面前綴pat = `(abc1)(abc2)(abc3)`reg = regexp.MustCompile(pat)fmt.Println(reg.LiteralPrefix()) // abc1abc2abc3 truepat = `(abc1)|(abc2)|(abc3)`reg = regexp.MustCompile(pat)fmt.Println(reg.LiteralPrefix()) // falsepat = `abc1|abc2|abc3`reg = regexp.MustCompile(pat)fmt.Println(reg.LiteralPrefix()) // abc false }------------------------------// 判斷// 判斷在 b(s、r)中能否找到匹配的字符串 func (re *Regexp) Match(b []byte) bool func (re *Regexp) MatchString(s string) bool func (re *Regexp) MatchReader(r io.RuneReader) bool------------------------------// 查找// 返回第一個匹配到的結果(結果以 b 的切片形式返回)。 func (re *Regexp) Find(b []byte) []byte// 返回第一個匹配到的結果及其分組內容(結果以 b 的切片形式返回)。 // 返回值中的第 0 個元素是整個正則表達式的匹配結果,后續元素是各個分組的 // 匹配內容,分組順序按照“(”的出現次序而定。 func (re *Regexp) FindSubmatch(b []byte) [][]byte// 功能同 Find,只不過返回的是匹配結果的首尾下標,通過這些下標可以生成切片。 // loc[0] 是結果切片的起始下標,loc[1] 是結果切片的結束下標。 func (re *Regexp) FindIndex(b []byte) (loc []int)// 功能同 FindSubmatch,只不過返回的是匹配結果的首尾下標,通過這些下標可以生成切片。 // loc[0] 是結果切片的起始下標,loc[1] 是結果切片的結束下標。 // loc[2] 是分組1切片的起始下標,loc[3] 是分組1切片的結束下標。 // loc[4] 是分組2切片的起始下標,loc[5] 是分組2切片的結束下標。 // 以此類推 func (re *Regexp) FindSubmatchIndex(b []byte) (loc []int)------------------------------// 示例:Find、FindSubmatch func main() {pat := `(((abc.)def.)ghi)`reg := regexp.MustCompile(pat)src := []byte(`abc-def-ghi abc+def+ghi`)// 查找第一個匹配結果fmt.Printf("%s\n", reg.Find(src)) // abc-def-ghifmt.Println()// 查找第一個匹配結果及其分組字符串first := reg.FindSubmatch(src)for i := 0; i < len(first); i++ {fmt.Printf("%d: %s\n", i, first[i])}// 0: abc-def-ghi// 1: abc-def-ghi// 2: abc-def-// 3: abc- }------------------------------// 示例:FindIndex、FindSubmatchIndex func main() {pat := `(((abc.)def.)ghi)`reg := regexp.MustCompile(pat)src := []byte(`abc-def-ghi abc+def+ghi`)// 查找第一個匹配結果matched := reg.FindIndex(src)fmt.Printf("%v\n", matched) // [0 11]m := matched[0]n := matched[1]fmt.Printf("%s\n\n", src[m:n]) // abc-def-ghi// 查找第一個匹配結果及其分組字符串matched = reg.FindSubmatchIndex(src)fmt.Printf("%v\n", matched) // [0 11 0 11 0 8 0 4]for i := 0; i < len(matched)/2; i++ {m := matched[i*2]n := matched[i*2+1]fmt.Printf("%s\n", src[m:n])}// abc-def-ghi// abc-def-ghi// abc-def-// abc- }------------------------------// 功能同上,只不過返回多個匹配的結果,而不只是第一個。 // n 是查找次數,負數表示不限次數。 func (re *Regexp) FindAll(b []byte, n int) [][]byte func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]bytefunc (re *Regexp) FindAllIndex(b []byte, n int) [][]int func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int------------------------------// 示例:FindAll、FindAllSubmatch func main() {pat := `(((abc.)def.)ghi)`reg := regexp.MustCompile(pat)s := []byte(`abc-def-ghi abc+def+ghi`)// 查找所有匹配結果for _, one := range reg.FindAll(s, -1) {fmt.Printf("%s\n", one)}// abc-def-ghi// abc+def+ghi// 查找所有匹配結果及其分組字符串all := reg.FindAllSubmatch(s, -1)for i := 0; i < len(all); i++ {fmt.Println()one := all[i]for i := 0; i < len(one); i++ {fmt.Printf("%d: %s\n", i, one[i])}}// 0: abc-def-ghi// 1: abc-def-ghi// 2: abc-def-// 3: abc-// 0: abc+def+ghi// 1: abc+def+ghi// 2: abc+def+// 3: abc+ }------------------------------// 功能同上,只不過在字符串中查找 func (re *Regexp) FindString(s string) string func (re *Regexp) FindStringSubmatch(s string) []stringfunc (re *Regexp) FindStringIndex(s string) (loc []int) func (re *Regexp) FindStringSubmatchIndex(s string) []intfunc (re *Regexp) FindAllString(s string, n int) []string func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]stringfunc (re *Regexp) FindAllStringIndex(s string, n int) [][]int func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int// 功能同上,只不過在 io.RuneReader 中查找。 func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int) func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int------------------------------// 替換(不會修改參數,結果是參數的副本)// 將 src 中匹配的內容替換為 repl(repl 中可以使用 $1 $name 等分組引用符)。 func (re *Regexp) ReplaceAll(src, repl []byte) []byte// 將 src 中匹配的內容經過 repl 函數處理后替換回去。 func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte// 將 src 中匹配的內容替換為 repl(repl 為字面值,不解析其中的 $1 $name 等)。 func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte// 功能同上,只不過在字符串中查找。 func (re *Regexp) ReplaceAllString(src, repl string) string func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string func (re *Regexp) ReplaceAllLiteralString(src, repl string) string// Expand 要配合 FindSubmatchIndex 一起使用。FindSubmatchIndex 在 src 中進行 // 查找,將結果存入 match 中。這樣就可以通過 src 和 match 得到匹配的字符串。 // template 是替換內容,可以使用分組引用符 $1、$2、$name 等。Expane 將其中的分 // 組引用符替換為前面匹配到的字符串。然后追加到 dst 的尾部(dst 可以為空)。 // 說白了 Expand 就是一次替換過程,只不過需要 FindSubmatchIndex 的配合。 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 func main() {pat := `(((abc.)def.)ghi)`reg := regexp.MustCompile(pat)src := []byte(`abc-def-ghi abc+def+ghi`)template := []byte(`$0 $1 $2 $3`)// 替換第一次匹配結果match := reg.FindSubmatchIndex(src)fmt.Printf("%v\n", match) // [0 11 0 11 0 8 0 4]dst := reg.Expand(nil, template, src, match)fmt.Printf("%s\n\n", dst)// abc-def-ghi abc-def-ghi abc-def- abc-// 替換所有匹配結果for _, match := range reg.FindAllSubmatchIndex(src, -1) {fmt.Printf("%v\n", match)dst := reg.Expand(nil, template, src, match)fmt.Printf("%s\n", dst)}// [0 11 0 11 0 8 0 4]// abc-def-ghi abc-def-ghi abc-def- abc-// [12 23 12 23 12 20 12 16]// abc+def+ghi abc+def+ghi abc+def+ abc+ }------------------------------// 其它// 以 s 中的匹配結果作為分割符將 s 分割成字符串列表。 // n 是分割次數,負數表示不限次數。 func (re *Regexp) Split(s string, n int) []string// 將當前正則對象復制一份。在多例程中使用同一正則對象時,給每個例程分配一個 // 正則對象的副本,可以避免多例程對單個正則對象的爭奪鎖定。 func (re *Regexp) Copy() *Regexp------------------------------------------------------------

?

總結

以上是生活随笔為你收集整理的Go的Regexp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲在线资源 | 色女人影院 | 中文字幕www | 国模在线观看 | 开心激情播播 | av手机版 | 亚洲成人黄色网址 | 成人18在线| 欧美国产日韩在线视频 | 欧美日韩在线播放视频 | 91 色| 黄色片免费在线观看 | 久久综合久久网 | 无码av免费精品一区二区三区 | 国产亚洲精品久久久久丝瓜 | 日本久久久久久久久 | 大奶骚| 国产一区二区三区高清 | 欧美激情中文字幕 | 国产伊人久久 | 亚洲精品无码久久久 | 日韩高清不卡在线 | 在线观看中文字幕一区 | 噜噜噜噜私人影院 | 91看片在线 | 亚洲三级欧美 | 日韩视频免费在线播放 | 法国空姐在线观看完整版 | 天天爽夜夜操 | 高清不卡一区 | 久久黄网站 | 久久亚洲av无码精品色午夜麻豆 | 男女午夜视频在线观看 | 精品久久无码中文字幕 | 久久人妻少妇嫩草av无码专区 | 日本黄色播放器 | 在线视频久| 日韩av网址在线观看 | 黑人巨大xxxxx性猛交 | 欧美亚洲精品在线 | 91精品国产精品 | 成人高清网站 | 丰满人妻熟妇乱偷人无码 | 天天曰天天爽 | japan粗暴video蹂躏 | 999精品在线 | 79日本xxxxxxxxx18 婷婷亚洲一区 | 亚洲av熟女高潮一区二区 | 亚洲五月综合 | 中日韩精品视频在线观看 | 华丽的外出在线观看 | 亚洲精品久久久狠狠狠爱 | 香蕉黄视频 | 免费观看国产视频 | 在线欧美亚洲 | 亚洲精品中文在线 | 三级色视频 | 精品国产一区二区三区四区精华 | 99视频这里有精品 | 免费看国产曰批40分钟 | 国产91在线亚洲 | 欧美黑人欧美精品刺激 | 狠狠干老司机 | 伊人影院在线视频 | 琪琪色影音先锋 | 久久123| 曰韩一级片 | 在线色 | 少妇2做爰bd在线意大利堕落 | 蜜臀久久精品久久久久久酒店 | 久久综合伊人77777麻豆最新章节 | 午夜精品久久久久久毛片 | 国产精品免费视频一区二区三区 | 97精品久久 | 亚洲中国色老太 | 国产精品欧美久久久久天天影视 | 青青青视频在线播放 | 就爱啪啪网 | www 在线观看视频 | 日韩成人一级片 | 国产91丝袜在线播放 | 成年人香蕉视频 | 黄色a级片视频 | 蜜臀av无码一区二区三区 | 级毛片内射视频 | 麻豆爱爱| 少妇做爰免费视看片 | 丝袜视频在线观看 | 欧美aa在线观看 | 欧美性极品 | 欧美性猛片aaaaaaa做受 | 黄色免费播放 | 国产欧美精品一区二区在线播放 | 国产极品美女高潮无套嗷嗷叫酒店 | 国产精品theporn动漫 | av九九九| 毛片毛片毛片毛片毛片毛片 | 欧美第一页草草影院 | av色网站|