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

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

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

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

1.regexp包概述

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

2. 常用函數(shù)

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

該函數(shù)用于編譯正則表達(dá)式字符串 pattern,并返回一個(gè) Regexp 類型對(duì)象。如果正則表達(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)行匹配。
  • []:字符集,匹配括號(hào)內(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)號(hào)):匹配任意一個(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)號(hào)。
// 特殊字符類:
//
// \b:匹配單詞邊界。例如,\bword\b 匹配完整的 "word",但不會(huì)匹配 "sword" 中的 "word"。
// \B:匹配非單詞邊界。
// 舉例說明
// ^\d{3}-\d{2}-\d{4}$:匹配符合格式的社會(huì)保障號(hào)(比如 "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)文章

  • Go語言展現(xiàn)快速排序算法全過程的思路及代碼示例

    Go語言展現(xiàn)快速排序算法全過程的思路及代碼示例

    這篇文章主要介紹了Go語言展現(xiàn)快速排序算法全過程的思路及代碼示例,文章最后作者還提到了對(duì)Quick Sort算法優(yōu)化的一些想法,需要的朋友可以參考下
    2016-04-04
  • Golang unsafe包中的類型和函數(shù)詳解

    Golang unsafe包中的類型和函數(shù)詳解

    Golang中的unsafe包用于在運(yùn)行時(shí)進(jìn)行低級(jí)別的操作,這些操作通常是不安全的,因?yàn)榭梢源蚱艷olang的類型安全性和內(nèi)存安全性,使用 unsafe包的程序可能會(huì)影響可移植性和兼容性,接下來看下unsafe包中的類型和函數(shù)
    2023-08-08
  • Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因

    Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因

    這篇文章主要為大家介紹了Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解Go語言中rand(隨機(jī)數(shù))包的使用

    詳解Go語言中rand(隨機(jī)數(shù))包的使用

    在Golang中,有兩個(gè)包提供了rand,分別為math/rand和crypto/rand對(duì)應(yīng)兩種應(yīng)用場景。math/rand包實(shí)現(xiàn)了偽隨機(jī)數(shù)生成器。也就是生成 整形和浮點(diǎn)型;crypto/rand包實(shí)現(xiàn)了用于加解密的更安全的隨機(jī)數(shù)生成器。本文就來和大家詳細(xì)講講math/rand的使用
    2022-08-08
  • Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    本文主要介紹了Windows下CMD執(zhí)行Go出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • GoLang中Module的基本使用方法

    GoLang中Module的基本使用方法

    Go module是從Go 1.11版本才引入的新功能,下面這篇文章主要給大家介紹了關(guān)于GoLang中Module的基本使用方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Golang使用pprof檢查內(nèi)存泄漏的全過程

    Golang使用pprof檢查內(nèi)存泄漏的全過程

    pprof 是golang提供的一款分析工具,可以分析CPU,內(nèi)存的使用情況,本篇文章關(guān)注它在分析內(nèi)存泄漏方面的應(yīng)用,本文給大家介紹了Golang使用pprof檢查內(nèi)存泄漏的全過程,文中通過代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Golang 并發(fā)的實(shí)現(xiàn)

    Golang 并發(fā)的實(shí)現(xiàn)

    本文主要介紹了Golang 并發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • Go語言實(shí)現(xiàn)定時(shí)任務(wù)速查手冊

    Go語言實(shí)現(xiàn)定時(shí)任務(wù)速查手冊

    在現(xiàn)代應(yīng)用程序開發(fā)中,定時(shí)任務(wù)是必不可少的功能之一,但你知道如何在 Go 語言中實(shí)現(xiàn)靈活高效的定時(shí)任務(wù)嗎,以下是幾個(gè)關(guān)鍵問題的答案,幫助你快速掌握 Go 語言定時(shí)任務(wù)的實(shí)現(xiàn)方法
    2026-05-05
  • Go應(yīng)用中優(yōu)雅處理Error的技巧總結(jié)

    Go應(yīng)用中優(yōu)雅處理Error的技巧總結(jié)

    在程序員中,尤其是go新手,經(jīng)常聽到的一個(gè)討論話題是:如何處理錯(cuò)誤,這篇文章主要給大家介紹了關(guān)于Go應(yīng)用中優(yōu)雅處理Error的一些相關(guān)技巧,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

政和县| 岫岩| 嘉义县| 宜兰市| 澄江县| 古浪县| 福清市| 桃园县| 老河口市| 保靖县| 拜城县| 西青区| 怀化市| 天气| 马鞍山市| 朔州市| 连江县| 晋宁县| 湄潭县| 永寿县| 唐海县| 温泉县| 图片| 津南区| 石河子市| 隆林| 孟连| 佛学| 金山区| 丰镇市| 邢台市| 青龙| 阜城县| 且末县| 会理县| 砀山县| 盐山县| 南丹县| 哈尔滨市| 迭部县| 蒙城县|