欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言中regexp正則表達(dá)式的操作實(shí)現(xiàn)

 更新時(shí)間:2025年09月30日 09:35:06   作者:{?■_■}  
regexp包支持對字符串的匹配、搜索和替換,它基于RE2正則表達(dá)式引擎,該包提供了多個(gè)函數(shù)來編譯正則表達(dá)式并進(jìn)行匹配、查找、替換等操作,下面就來詳細(xì)的介紹一下regexp正則表達(dá)式的實(shí)現(xiàn),感興趣的可以了解一下

Go 語言的 regexp 包提供了對正則表達(dá)式的支持。
正則表達(dá)式(regex)是一種字符串搜索模式,用來檢查一個(gè)字符串是否符合某種特定的模式,或從中提取符合某種模式的子字符串。

1.regexp包概述

regexp 包支持對字符串的匹配、搜索和替換。它基于 RE2 正則表達(dá)式引擎,性能優(yōu)異,避免了回溯帶來的性能瓶頸。
該包提供了多個(gè)函數(shù)來編譯正則表達(dá)式并進(jìn)行匹配、查找、替換等操作。

2. 常用函數(shù)

2.1regexp.Compile(pattern string) (*Regexp, error)

該函數(shù)用于編譯正則表達(dá)式字符串 pattern,并返回一個(gè) Regexp 類型對象。如果正則表達(dá)式無效,會(huì)返回一個(gè)錯(cuò)誤。
示例:

r, err := regexp.Compile(`\d+`)  // 匹配一個(gè)或多個(gè)數(shù)字
if err != nil {
    fmt.Println("Error compiling regex:", err)
    return
}

2.2regexp.MustCompile(pattern string) *Regexp

該函數(shù)與 Compile 類似,不過如果正則表達(dá)式不合法,它會(huì)立即 panic。適合在啟動(dòng)時(shí)使用,確保正則表達(dá)式是合法的。
示例:

r := regexp.MustCompile(`\d+`)

2.3r.MatchString(s string) bool

該方法檢查給定的字符串 s 是否匹配正則表達(dá)式。如果匹配,返回 true,否則返回 false。
示例:

r := regexp.MustCompile(`\d+`)
fmt.Println(r.MatchString("12345"))  // 輸出:true
fmt.Println(r.MatchString("abc"))    // 輸出:false

2.4r.FindString(s string) string

該方法查找字符串中第一個(gè)匹配正則表達(dá)式的子字符串并返回。如果沒有找到匹配項(xiàng),則返回空字符串。
示例:

r := regexp.MustCompile(`\d+`)
fmt.Println(r.FindString("abc 12345 xyz")) // 輸出:12345

2.5r.FindAllString(s string, n int) []string

查找字符串中所有匹配正則表達(dá)式的子字符串,并返回一個(gè)字符串切片。如果 n 為 -1,則表示返回所有匹配的子串。
示例:

r := regexp.MustCompile(`\d+`)
fmt.Println(r.FindAllString("abc 123 4567 89", -1))  // 輸出:[123 4567 89]

2.6r.ReplaceAllString(s string, repl string) string

該方法用于替換字符串中所有匹配正則表達(dá)式的子字符串。repl 是替換的文本。
示例:

r := regexp.MustCompile(`\d+`)
result := r.ReplaceAllString("abc 123 4567 xyz", "#")
fmt.Println(result) // 輸出:abc # # xyz

2.7r.FindSubmatch(s string) [][]byte

查找第一個(gè)匹配的子字符串,并返回每個(gè)捕獲組的內(nèi)容(包括完整匹配)。返回的是一個(gè)二維字節(jié)切片,每個(gè)字節(jié)切片表示一個(gè)匹配項(xiàng)。
示例:

r := regexp.MustCompile(`(\d+)-(\d+)`)
match := r.FindSubmatch([]byte("abc 123-4567"))
fmt.Println(match)  // 輸出:[[123-4567 123 4567]]

2.8r.Split(s string, n int) []string

根據(jù)正則表達(dá)式分割字符串,返回一個(gè)字符串切片。n 參數(shù)表示最多分割的次數(shù)。
示例:

r := regexp.MustCompile(`\s+`)
fmt.Println(r.Split("this is a test", -1))  // 輸出:[this is a test]

3. 正則表達(dá)式語法

Go 語言的 regexp 包使用的是 RE2 正則表達(dá)式引擎,它支持一些常見的正則表達(dá)式語法:

  • .:匹配除換行符以外的任何單個(gè)字符。
  • ^:匹配輸入字符串的開始位置。
  • $:匹配輸入字符串的結(jié)束位置。
  • *:匹配前一個(gè)字符零次或多次。
  • +:匹配前一個(gè)字符一次或多次。
  • ?:匹配前一個(gè)字符零次或一次。
  • {n,m}:匹配前一個(gè)字符至少 n 次,但不超過 m 次。
  • |:匹配左側(cè)或右側(cè)的表達(dá)式。
  • ():分組,括起來的部分作為一個(gè)整體進(jìn)行匹配。
  • []:字符集,匹配括號內(nèi)的任何一個(gè)字符。
  • \d:匹配一個(gè)數(shù)字,等同于 [0-9]
  • \w:匹配一個(gè)字母或數(shù)字字符,等同于 [a-zA-Z0-9_]。
  • \s:匹配一個(gè)空白字符(包括空格、制表符、換行符等)。

4. 示例

示例 1:檢查字符串是否符合正則表達(dá)式

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// 編譯正則表達(dá)式
	r := regexp.MustCompile(`\d+`)
	// 檢查字符串是否包含數(shù)字
	fmt.Println(r.MatchString("abc123"))  // 輸出:true
	fmt.Println(r.MatchString("abc"))     // 輸出:false
}

示例 2:提取數(shù)字

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// 編譯正則表達(dá)式
	r := regexp.MustCompile(`\d+`)
	// 查找字符串中的第一個(gè)數(shù)字
	result := r.FindString("abc 12345 xyz")
	fmt.Println(result)  // 輸出:12345
}

示例 3:替換字符串中的數(shù)字

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// 編譯正則表達(dá)式
	r := regexp.MustCompile(`\d+`)
	// 替換數(shù)字為 #
	result := r.ReplaceAllString("abc 123 4567 xyz", "#")
	fmt.Println(result)  // 輸出:abc # # xyz
}

示例 4:分割字符串

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// 編譯正則表達(dá)式
	r := regexp.MustCompile(`\s+`)
	// 按空白字符分割字符串
	result := r.Split("this is a test", -1)
	fmt.Println(result)  // 輸出:[this is a test]
}

5. 性能與注意事項(xiàng)

  • Go 的 regexp 包非常高效,特別是在處理大數(shù)據(jù)量時(shí),RE2 正則表達(dá)式引擎避免了回溯帶來的性能問題。
  • 使用正則表達(dá)式時(shí)需要謹(jǐn)慎,以避免過度復(fù)雜的模式導(dǎo)致性能瓶頸。

總結(jié)

regexp 包是 Go 語言中一個(gè)強(qiáng)大的工具,用于進(jìn)行字符串模式匹配和替換操作。
通過使用該包,你可以靈活地處理復(fù)雜的字符串匹配任務(wù),并且可以高效地進(jìn)行文本處理。

案例

package _case

import (
	"fmt"
	"regexp"
)

func RegexpCase() {
	test1()
	fmt.Println("------------")
	test2()
}

func test2() {
	// 案例
	pattern := `^[a-z]+\[[0-9]+\]$`
	re := regexp.MustCompile(pattern)
	fmt.Println(re.MatchString("asdf[22114]"))

	// FindAll傳入[]byte;
	// FindAllString傳入string
	bytes := re.FindAll([]byte("haha[1234]"), -1)
	fmt.Println(string(bytes[0]))

	re = regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
	str := "今天日期:2024-10-21"
	replaced := re.ReplaceAllString(str, "我日你媽的")
	fmt.Println(replaced)
}

// 常見的正則表達(dá)式字符及其含義
// 錨點(diǎn)字符:
//
// ^:匹配字符串的開始。例如,^abc 匹配以 "abc" 開頭的字符串。
// $:匹配字符串的結(jié)束。例如,abc$ 匹配以 "abc" 結(jié)尾的字符串。
// 字符匹配:
//
// .(點(diǎn)號):匹配任意一個(gè)字符,除了換行符。例子:a.b 可以匹配 "a_b"、"a1b",但不能匹配 "ab"。
// [ ]:定義字符集合,匹配集合中的任意一個(gè)字符。例如,[abc] 匹配 "a"、"b" 或 "c"。
// [^ ]:排除字符集合,匹配集合外的任意字符。例如,[^abc] 匹配除 "a"、"b" 和 "c" 以外的任意字符。
// 量詞:
//
// *:匹配前面的元素 0 次或多次。例如,a* 匹配空字符串、"a"、"aa" 等。
// +:匹配前面的元素 1 次或多次。例如,a+ 匹配 "a"、"aa"、"aaa" 等。
// ?:匹配前面的元素 0 次或 1 次。例如,a? 匹配空字符串或 "a"。
// {n}:匹配前面的元素恰好 n 次。例如,a{3} 匹配 "aaa"。
// {n,}:匹配前面的元素至少 n 次。例如,a{2,} 匹配 "aa"、"aaa"、"aaaa" 等。
// {n,m}:匹配前面的元素至少 n 次,但不超過 m 次。例如,a{2,4} 匹配 "aa"、"aaa" 或 "aaaa"。
// 字符類:
//
// \d:匹配任意數(shù)字,等同于 [0-9]。
// \D:匹配非數(shù)字字符,等同于 [^0-9]。
// \w:匹配字母、數(shù)字或下劃線,等同于 [a-zA-Z0-9_]。
// \W:匹配非字母、數(shù)字或下劃線字符,等同于 [^a-zA-Z0-9_]。
// \s:匹配任意空白字符(包括空格、制表符、換行符等)。
// \S:匹配任意非空白字符。
// 分組和選擇:
//
// ( ):定義捕獲組,匹配的內(nèi)容可以在后續(xù)操作中引用。例如,(abc) 匹配 "abc"。
// |:邏輯或,表示左右兩邊任意一個(gè)匹配即可。例如,a|b 匹配 "a" 或 "b"。
// 反斜杠轉(zhuǎn)義:
//
// \:反斜杠用于轉(zhuǎn)義特殊字符。例如,\. 匹配字符 ".",而不是表示任意字符的點(diǎn)號。
// 特殊字符類:
//
// \b:匹配單詞邊界。例如,\bword\b 匹配完整的 "word",但不會(huì)匹配 "sword" 中的 "word"。
// \B:匹配非單詞邊界。
// 舉例說明
// ^\d{3}-\d{2}-\d{4}$:匹配符合格式的社會(huì)保障號(比如 "123-45-6789")。
//
// ^:匹配字符串的開始。
// \d{3}:匹配 3 個(gè)數(shù)字。
// -:匹配字符 -。
// \d{2}:匹配 2 個(gè)數(shù)字。
// \d{4}:匹配 4 個(gè)數(shù)字。
// $:匹配字符串的結(jié)束。
// ([A-Z][a-z]+):匹配以大寫字母開頭的單詞(如 "Apple")。
//
// [A-Z]:匹配一個(gè)大寫字母。
// [a-z]+:匹配一個(gè)或多個(gè)小寫字母。
// ( ):定義捕獲組。
func test1() {
	// Compile解析并返回一個(gè)正則表達(dá)式。如果成功返回,該Regexp就可用于匹配文本。
	re := regexp.MustCompile(".com")
	// FindString
	fmt.Println(re.FindString("(cainiao.com)"))
	fmt.Println(re.FindString("(cainiao.dz)"))
	fmt.Println(re.FindString("(cainiao1.com1)"))

	// FindStringIndex return符合正則表達(dá)式的字符的索引,左閉右開
	fmt.Println(re.FindStringIndex("google.com"))
	fmt.Println(re.FindStringIndex("abc.org"))
	fmt.Println(re.FindStringIndex("fb.com"))

	// FindStringSubmatch 該方法返回具有最左邊匹配項(xiàng)和匹配組的字符串。找不到返回空字符串
	// ([a-z]+)稱為匹配組
	re1 := regexp.MustCompile("f([a-z]+)ing")
	re2 := regexp.MustCompile("f([a-z]+)ing")
	fmt.Println(re1.FindStringSubmatch("flying1"))
	fmt.Println(re1.FindStringSubmatch("abcfloatingxyz"))
	fmt.Println(re2.FindStringSubmatch("flying1"))
	fmt.Println(re2.FindStringSubmatch("abcfloatingxyz"))

	fmt.Println("-----------")
	pattern := "([a-z]+)"
	regex := regexp.MustCompile(pattern)
	// FindStringSubmatch 只會(huì)返回一個(gè) 包含的匹配結(jié)果,和一個(gè) 匹配組 合成的一個(gè)切片
	// len:2
	matches := regex.FindStringSubmatch("apple banana orange")
	fmt.Println(matches[0])
	fmt.Println(matches[1])
	//fmt.Println(matches[2])
	//fmt.Println(matches[3])
	// 如果想要匹配所有符合正則表達(dá)式的值,要用FindAllStringSubmatch
	// n為-1時(shí),匹配所有符合條件的字符串,n不為-1時(shí),表示只匹配n次
	// 會(huì)返回一個(gè)二維切片
	matches1 := regex.FindAllStringSubmatch("apple banana orange", -1)
	fmt.Println(matches1)
	// 遍歷匹配結(jié)果
	for i, match := range matches1 {
		fmt.Printf("匹配 %d 結(jié)果:%s\n", i, match[0])
		fmt.Printf("捕獲組 %d 結(jié)果:%s\n", i, match[1])
	}

	// 命名捕獲組語法
	// (?P<name>pattern)
	// name:捕獲組名稱,pattern:捕獲組模式
	pattern = "(?P<fruit>[a-z]+)"
	// 建立正則表達(dá)式
	re3 := regexp.MustCompile(pattern)
	// 匹配單個(gè)值
	matches = re3.FindStringSubmatch("apple banana orange")
	fruit := matches[re3.SubexpIndex("fruit")]
	fmt.Println(fruit)
	// 匹配多個(gè)值
	matches1 = re3.FindAllStringSubmatch("apple banana orange", -1)
	for i, match := range matches1 {
		fruit = match[re3.SubexpIndex("fruit")]
		fmt.Printf("匹配結(jié)果%d:%s\n", i, match[0])
		fmt.Printf("捕獲組組%d:%s\n", i, fruit)
	}

	// regexp.Match() 判斷在[]byte中能否找到給定正則表達(dá)式的值,返回bool和err
	// .*:表示任意數(shù)量的任意字符(包括 0 個(gè)字符),可以匹配任何字符,除了換行符
	// "^abc.*z$"含義:
	// 匹配以abc開頭中間任意個(gè)數(shù)任意類型字符(除換行符外)以z結(jié)尾的字符串
	matched, err := regexp.Match("^abc.*z$", []byte("abcdeeffgz"))
	fmt.Println(matched, err)
	matched, err = regexp.Match("^abc.*z$", []byte("bcdefgz"))
	fmt.Println(matched, err)

	// regexp.MatchString()類似regexp.Match()不過他只傳字符串,而Match只傳[]byte
}

到此這篇關(guān)于go語言中regexp正則表達(dá)式的操作實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語言 regexp正則表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang獲取prometheus數(shù)據(jù)(prometheus/client_golang包)

    golang獲取prometheus數(shù)據(jù)(prometheus/client_golang包)

    本文主要介紹了使用Go語言的prometheus/client_golang包來獲取Prometheus監(jiān)控?cái)?shù)據(jù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • 詳解Go語言如何實(shí)現(xiàn)類似Python中的with上下文管理器

    詳解Go語言如何實(shí)現(xiàn)類似Python中的with上下文管理器

    熟悉?Python?的同學(xué)應(yīng)該知道?Python?中的上下文管理器非常好用,那么在?Go?中是否也能實(shí)現(xiàn)上下文管理器呢,下面小編就來和大家仔細(xì)講講吧
    2023-07-07
  • go語言中值類型和指針類型的深入理解

    go語言中值類型和指針類型的深入理解

    這篇文章主要給大家介紹了關(guān)于go語言中值類型和指針類型的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Go語言中的錯(cuò)誤處理過程

    Go語言中的錯(cuò)誤處理過程

    Go錯(cuò)誤處理涵蓋接口、創(chuàng)建方式、檢查模式、包裝、最佳實(shí)踐及工具庫,強(qiáng)調(diào)顯式檢查、簡單可預(yù)測和錯(cuò)誤即值理念,提升代碼清晰度和可靠性
    2025-07-07
  • Go slice切片使用示例詳解

    Go slice切片使用示例詳解

    這篇文章主要為大家介紹了Go slice切片使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解

    Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解

    本文我們通過 cast.ToString() 函數(shù)的使用,簡單介紹了cast 的使用方法,除此之外,它還支持很多其他類型,在這沒有多多介紹,對Golang 類型轉(zhuǎn)換庫 cast相關(guān)知識感興趣的朋友一起看看吧
    2021-11-11
  • 自己動(dòng)手用Golang實(shí)現(xiàn)約瑟夫環(huán)算法的示例

    自己動(dòng)手用Golang實(shí)現(xiàn)約瑟夫環(huán)算法的示例

    這篇文章主要介紹了自己動(dòng)手用Golang實(shí)現(xiàn)約瑟夫環(huán)算法的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 一文掌握Golang的panic和recover實(shí)戰(zhàn)

    一文掌握Golang的panic和recover實(shí)戰(zhàn)

    Go語言中,異常處理通常依賴error返回值,本文將通過示例展示如何在Go語言中正確使用recover來處理panic異常,防止程序直接崩潰,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說明

    Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說明

    這篇文章主要介紹了Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Go channel實(shí)現(xiàn)原理分析

    Go channel實(shí)現(xiàn)原理分析

    Channel是go語言內(nèi)置的一個(gè)非常重要的特性,也是go并發(fā)編程的兩大基石之一,下面這篇文章主要給大家介紹了關(guān)于Go中channel的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評論