国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Golang每日一庫(kù)之regex

這篇具有很好參考價(jià)值的文章主要介紹了Golang每日一庫(kù)之regex。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文地址: 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è)步驟:

  1. 定義正則表達(dá)式模式:即給出需要匹配或查找的文本規(guī)則,如匹配所有以"A"開(kāi)頭的單詞,模式可以是 "^A\w+"。
  2. 編譯正則表達(dá)式:將正則表達(dá)式模式編譯成程序可識(shí)別的格式。
  3. 指定匹配文本:輸入需要進(jìn)行匹配操作的文本,如一段英語(yǔ)文章。
  4. 進(jìn)行匹配操作:程序會(huì)根據(jù)輸入的正則表達(dá)式和匹配文本進(jìn)行匹配操作,搜索所有與正則表達(dá)式模式匹配的子串。
  5. 獲取匹配結(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)單主要分為三步

  1. 正則( 針對(duì)字符串匹配規(guī)則)
  2. 元字符(基本上大同小異)
  3. 方法(特定語(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é)果如下:
Golang每日一庫(kù)之regex

例子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é)果
Golang每日一庫(kù)之regex

本文地址: 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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 每日一庫(kù):cobra 簡(jiǎn)介

    每日一庫(kù):cobra 簡(jiǎn)介

    當(dāng)你需要為你的 Go 項(xiàng)目創(chuàng)建一個(gè)強(qiáng)大的命令行工具時(shí),你可能會(huì)遇到許多挑戰(zhàn),比如如何定義命令、標(biāo)志和參數(shù),如何生成詳細(xì)的幫助文檔,如何支持子命令等等。為了解決這些問(wèn)題, github.com/spf13/cobra 就可以派上用場(chǎng)。 github.com/spf13/cobra 是一個(gè)用于構(gòu)建強(qiáng)大的命令行應(yīng)用程

    2024年02月08日
    瀏覽(30)
  • 每日一庫(kù):Prometheus

    每日一庫(kù):Prometheus

    Prometheus 是一個(gè)開(kāi)源的系統(tǒng)監(jiān)控和警報(bào)工具,最初由 SoundCloud 開(kāi)發(fā),并于 2012 年發(fā)布為開(kāi)源項(xiàng)目。它是一個(gè)非常強(qiáng)大和靈活的工具,用于監(jiān)控應(yīng)用程序和系統(tǒng)的性能,并根據(jù)預(yù)定義的規(guī)則觸發(fā)警報(bào)。以下是對(duì) Prometheus 的詳細(xì)介紹: 多維數(shù)據(jù)模型: Prometheus 使用多維數(shù)據(jù)模型來(lái)

    2024年02月08日
    瀏覽(31)
  • 每日一庫(kù):gosec

    每日一庫(kù):gosec

    gosec 是一個(gè)用于在 Go 代碼中查找安全問(wèn)題的開(kāi)源工具,它可以幫助發(fā)現(xiàn)可能的漏洞和潛在的安全風(fēng)險(xiǎn)。以下是關(guān)于 gosec 的詳細(xì)介紹: gosec 是一個(gè)靜態(tài)分析工具,用于掃描 Go 代碼以查找潛在的安全問(wèn)題。它可以識(shí)別常見(jiàn)的代碼漏洞、敏感信息泄露和其他安全問(wèn)題,幫助開(kāi)發(fā)人

    2024年02月12日
    瀏覽(18)
  • 每日一庫(kù):fsnotify簡(jiǎn)介

    每日一庫(kù):fsnotify簡(jiǎn)介

    fsnotify 是一個(gè)用Go編寫(xiě)的文件系統(tǒng)通知庫(kù)。它提供了一種觀察文件系統(tǒng)變化的機(jī)制,例如文件的創(chuàng)建、修改、刪除、重命名和權(quán)限修改。它使用特定平臺(tái)的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。 fsnotify 具有以下特點(diǎn): 跨平臺(tái)支持

    2024年02月11日
    瀏覽(20)
  • 每日一庫(kù):pprof簡(jiǎn)介

    每日一庫(kù):pprof簡(jiǎn)介

    pprof 是Go語(yǔ)言的一個(gè)性能分析庫(kù),它可以幫助開(kāi)發(fā)者找出程序中的性能瓶頸。 pprof 提供了CPU分析、內(nèi)存分析、阻塞分析等多種性能分析功能。 以下是 pprof 的主要特性: CPU分析 : pprof 可以記錄程序在CPU上的運(yùn)行時(shí)間,并將這些數(shù)據(jù)以火焰圖的形式展示出來(lái)。這可以幫助開(kāi)發(fā)

    2024年02月10日
    瀏覽(16)
  • 每日一庫(kù):lumberjack -- 日志輪換和管理

    每日一庫(kù):lumberjack -- 日志輪換和管理

    在開(kāi)發(fā)應(yīng)用程序時(shí),記錄日志是一項(xiàng)關(guān)鍵的任務(wù),以便在應(yīng)用程序運(yùn)行時(shí)追蹤問(wèn)題、監(jiān)視性能和保留審計(jì)記錄。Go 語(yǔ)言提供了靈活且強(qiáng)大的日志記錄功能,可以通過(guò)多種方式配置和使用。其中一個(gè)常用的日志記錄庫(kù)是 github.com/natefinch/lumberjack ,它提供了一個(gè)方便的方式來(lái)處理

    2024年02月08日
    瀏覽(26)
  • Golang標(biāo)準(zhǔn)庫(kù)之bytes介紹

    本次主要介紹golang中的標(biāo)準(zhǔn)庫(kù) bytes ,基本上參考了 字節(jié) | bytes 、Golang標(biāo)準(zhǔn)庫(kù)——bytes 文章。 bytes 庫(kù)主要包含 5 大部分,即: 常量 變量 函數(shù) Buffer Reader 我們依次學(xué)習(xí)上面的 5 大部分。 bytes.MinRead 是一個(gè)常量,表示在使用 ReadFrom 方法從 io.Reader 中讀取數(shù)據(jù)時(shí),每次讀取的最小

    2024年02月07日
    瀏覽(16)
  • golang常用庫(kù)之-golang-jwt/jwt包

    github: https://github.com/golang-jwt/jwt golang-jwt/jwt 是一個(gè)在 Go 語(yǔ)言中使用 JSON Web Tokens(JWT)進(jìn)行身份驗(yàn)證和授權(quán)的庫(kù)。JWT 是一種用于在跨網(wǎng)絡(luò)進(jìn)行安全通信的開(kāi)放標(biāo)準(zhǔn)(RFC 7519),它使用一個(gè) JSON 對(duì)象來(lái)表示被聲明的安全性信息。 golang-jwt/jwt 包提供了創(chuàng)建、解析和驗(yàn)證 JWT 的功能

    2024年01月23日
    瀏覽(19)
  • 7天玩轉(zhuǎn) Golang 標(biāo)準(zhǔn)庫(kù)之 http/net

    在構(gòu)建web應(yīng)用時(shí),我們經(jīng)常需要處理HTTP請(qǐng)求、做網(wǎng)頁(yè)抓取或者搭建web服務(wù)器等任務(wù),而Go語(yǔ)言在這方面為我們提供了強(qiáng)大的內(nèi)置工具:net/http標(biāo)準(zhǔn)庫(kù),它為我們操作和處理HTTP協(xié)議提供了便利。 首先,我們來(lái)看看如何使用net/http標(biāo)準(zhǔn)庫(kù)發(fā)送一個(gè)HTTP請(qǐng)求。net/http庫(kù)中的 http.Get 函數(shù)

    2024年02月04日
    瀏覽(27)
  • 【微信小程序】如何獲得自己當(dāng)前的定位呢?本文利用逆地址解析、uni-app帶你實(shí)現(xiàn)

    【微信小程序】如何獲得自己當(dāng)前的定位呢?本文利用逆地址解析、uni-app帶你實(shí)現(xiàn)

    目錄 前言 效果展示 一、在騰訊定位服務(wù)配置微信小程序JavaScript SDK 二、使用uni-app獲取定位的經(jīng)緯度 三、?逆地址解析,獲取精確定位 四、小提示 在瀏覽器搜索騰訊定位服務(wù),找到官方網(wǎng)站,利用微信或者其他賬號(hào)注冊(cè)登錄,登錄后如下圖操作 點(diǎn)進(jìn)去之后,可以看到如下圖

    2024年01月19日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包