您現在的位置是:首頁 > 手機遊戲首頁手機遊戲

golang2021函式與包(70)Go語言正則表示式:regexp包

  • 由 清華學神尹成程式設計帝國 發表于 手機遊戲
  • 2022-07-15
簡介package mainimport (“fmt”“regexp”)func main() {buf := “abc azc a7c aac 888 a9ctac”解析正則表示式,如果成功返回直譯器reg1 := regexp

exp jl2021是什麼意思

正則表示式是一種進行模式匹配和文字操縱的複雜而又強大的工具。雖然正則表示式比純粹的文字匹配效率低,但是它卻更靈活,按照它的語法規則,根據需求構造出的正則表示式能夠從原始文字中篩選出幾乎任何你想要得到的字元組合。

Go語言透過 regexp 包為正則表示式提供了官方支援,其採用 RE2 語法,除了\c、\C外,Go語言和 Perl、Python 等語言的正則基本一致。

正則表示式語法規則

正則表示式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為“元字元”)構成的文字序列,可以是單個的字元、字元集合、字元範圍、字元間的選擇或者所有這些元件的任意組合。

下面的表格中列舉了構成正則表示式的一些語法規則及其含義。

1) 字元

2) 數量詞(用在字元或 (。。。) 之後)

3) 邊界匹配

4) 邏輯、分組

5) 特殊構造(不作為分組)

Regexp 包的使用

下面通過幾個示例來演示一下 regexp 包的使用。

【示例 1】匹配指定型別的字串。

package main

import (

“fmt”

“regexp”

func main() {

buf := “abc azc a7c aac 888 a9c tac”

//解析正則表示式,如果成功返回直譯器

reg1 := regexp。MustCompile(`a。c`)

if reg1 == nil {

fmt。Println(“regexp err”)

return

}

//根據規則提取關鍵資訊

result1 := reg1。FindAllStringSubmatch(buf, -1)

fmt。Println(“result1 = ”, result1)

}

執行結果如下:

result1 = [[abc] [azc] [a7c] [aac] [a9c]]

【示例 2】匹配 a 和 c 中間包含一個數字的字串。

package main

import (

“fmt”

“regexp”

func main() {

buf := “abc azc a7c aac 888 a9c tac”

//解析正則表示式,如果成功返回直譯器

reg1 := regexp。MustCompile(`a[0-9]c`)

if reg1 == nil { //解釋失敗,返回nil

fmt。Println(“regexp err”)

return

}

//根據規則提取關鍵資訊

result1 := reg1。FindAllStringSubmatch(buf, -1)

fmt。Println(“result1 = ”, result1)

}

執行結果如下:

result1 = [[a7c] [a9c]]

【示例 3】使用 \d 來匹配 a 和 c 中間包含一個數字的字串。

package main

import (

“fmt”

“regexp”

func main() {

buf := “abc azc a7c aac 888 a9c tac”

//解析正則表示式,如果成功返回直譯器

reg1 := regexp。MustCompile(`a\dc`)

if reg1 == nil { //解釋失敗,返回nil

fmt。Println(“regexp err”)

return

}

//根據規則提取關鍵資訊

result1 := reg1。FindAllStringSubmatch(buf, -1)

fmt。Println(“result1 = ”, result1)

}

執行結果如下:

result1 = [[a7c] [a9c]]

【示例 4】匹配字串中的小數。

package main

import (

“fmt”

“regexp”

func main() {

buf := “43。14 567 agsdg 1。23 7。 8。9 1sdljgl 6。66 7。8 ”

//解釋正則表示式

reg := regexp。MustCompile(`\d+\。\d+`)

if reg == nil {

fmt。Println(“MustCompile err”)

return

}

//提取關鍵資訊

//result := reg。FindAllString(buf, -1)

result := reg。FindAllStringSubmatch(buf, -1)

fmt。Println(“result = ”, result)

}

執行結果如下:

result = [[43。14] [1。23] [8。9] [6。66] [7。8]]

【示例 5】匹配 div 標籤中的內容。

package main

import (

“fmt”

“regexp”

func main() {

// 原生字串

buf := `

<!DOCTYPE html>

清華尹成大神網 | Go語言入門教程

Go語言簡介

Go語言基本語法

Go語言變數的宣告

Go語言教程簡明版

Go語言容器

Go語言函式

`

//解釋正則表示式

reg := regexp。MustCompile(`

(?s:(。*?))
`)

if reg == nil {

fmt。Println(“MustCompile err”)

return

}

//提取關鍵資訊

result := reg。FindAllStringSubmatch(buf, -1)

//過濾<>

for _, text := range result {

fmt。Println(“text[1] = ”, text[1])

}

}

執行結果如下:

text[1] = Go語言簡介

text[1] = Go語言基本語法

Go語言變數的宣告

Go語言教程簡明版

text[1] = Go語言容器

text[1] = Go語言函式

【示例 6】透過 Compile 方法返回一個 Regexp 物件,實現匹配,查詢,替換相關的功能。

package main

import (

“fmt”

“regexp”

“strconv”

func main() {

//目標字串

searchIn := “John: 2578。34 William: 4567。23 Steve: 5632。18”

pat := “[0-9]+。[0-9]+” //正則

f := func(s string) string{

v, _ := strconv。ParseFloat(s, 32)

return strconv。FormatFloat(v * 2, ‘f’, 2, 32)

}

if ok, _ := regexp。Match(pat, []byte(searchIn)); ok {

fmt。Println(“Match Found!”)

}

re, _ := regexp。Compile(pat)

//將匹配到的部分替換為 “##。#”

str := re。ReplaceAllString(searchIn, “##。#”)

fmt。Println(str)

//引數為函式時

str2 := re。ReplaceAllStringFunc(searchIn, f)

fmt。Println(str2)

}

輸出結果:

Match Found!

John: ##。# William: ##。# Steve: ##。#

John: 5156。68 William: 9134。46 Steve: 11264。36

上面程式碼中 Compile 方法可以解析並返回一個正則表示式,如果成功返回,則說明該正則表示式正確可用於匹配文字。

另外我們也可以使用 MustCompile 方法,它也可以像 Compile 方法一樣檢驗正則的有效性,但是當正則不合法時程式將 panic。

golang2021函式與包(70)Go語言正則表示式:regexp包

Top