您現在的位置是:首頁 > 手機遊戲首頁手機遊戲
golang2021函式與包(70)Go語言正則表示式:regexp包
- 2022-07-15
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語言教程簡明版
`
//解釋正則表示式
reg := regexp。MustCompile(`
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。