golang 正则

golang 正则

golang 正则

1. 什么是正则表达式

正则表达式(Regular Expression)是一种用于匹配、查找和替换文本特定模式的字符串。通过使用正则表达式,我们可以方便地从大量文本中提取我们所需要的信息,进行模式匹配、替换或验证操作。

在golang中,正则表达式由正则语法和相关函数组成,可以轻松处理字符串中的匹配和替换操作。

2. 正则表达式基础语法

2.1 字面量字符

正则表达式中的字面量字符是指表示其自身的字符。比如正则表达式abc表示匹配一个完整的abc字符串。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`abc`)
    fmt.Println(re.MatchString("abc")) // true
    fmt.Println(re.MatchString("def")) // false
}

输出:

true
false

其中,regexp.MustCompile函数用于编译并返回一个正则表达式。然后,我们可以使用MatchString函数来检查给定的字符串是否匹配这个正则表达式。

2.2 字符类

字符类(Character Class)用于指定多个字符中的任意一个。使用方括号[]将多个字符括起来表示一个字符类。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`[abc]`)
    fmt.Println(re.MatchString("a"))   // true
    fmt.Println(re.MatchString("b"))   // true
    fmt.Println(re.MatchString("c"))   // true
    fmt.Println(re.MatchString("d"))   // false
    fmt.Println(re.MatchString("abc")) // false
}

输出:

true
true
true
false
false

上述代码中,[abc]表示匹配字符abc

2.3 范围字符类

范围字符类(Range Character Class)可以表示一个连续范围内的字符。使用连字符-连接两个字符表示一个范围。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`[0-9]`)
    fmt.Println(re.MatchString("5"))   // true
    fmt.Println(re.MatchString("9"))   // true
    fmt.Println(re.MatchString("a"))   // false
    fmt.Println(re.MatchString("10"))  // false
    fmt.Println(re.MatchString("a5b")) // true
}

输出:

true
true
false
false
true

上述代码中,[0-9]表示匹配一个数字字符。

2.4 反向字符类

反向字符类(Negated Character Class)用^表示,表示任意不在该字符类中的字符。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`[^0-9]`)
    fmt.Println(re.MatchString("a"))   // true
    fmt.Println(re.MatchString("9"))   // false
    fmt.Println(re.MatchString("10"))  // true
    fmt.Println(re.MatchString("a5b")) // true
}

输出:

true
false
true
true

上述代码中,[^0-9]表示匹配一个非数字字符。

2.5 通配符

通配符(Wildcard)用.表示,匹配任意字符(除了换行符)。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`a.b`)
    fmt.Println(re.MatchString("aab")) // true
    fmt.Println(re.MatchString("acb")) // true
    fmt.Println(re.MatchString("abc")) // false
}

输出:

true
true
false

上述代码中,a.b表示匹配以a开头和b结尾的任意3个字符的字符串。

2.6 修饰符

正则表达式中常用的修饰符有ims

  • i(不区分大小写):表示匹配时不区分字符的大小写。
  • m(多行):表示处理多行文本,^$可以匹配每一行的行头和行尾。
  • s(单行):表示处理单行文本,.可以匹配任意字符(包括换行符)。

修饰符可以通过正则表达式的语法进行设置。比如,(?i)表示设置不区分大小写。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(?i)abc`)
    fmt.Println(re.MatchString("ABC"))   // true
    fmt.Println(re.MatchString("aBC"))   // true
    fmt.Println(re.MatchString("Abc"))   // true
    fmt.Println(re.MatchString("def"))   // false
    fmt.Println(re.MatchString("aAbc"))  // true
    fmt.Println(re.MatchString("a\nbc")) // true
}

输出:

true
true
true
false
true
true

上述代码中,(?i)表示匹配时不区分大小写。

3. 正则表达式函数

在golang中,对正则表达式的操作主要通过regexp包提供的函数来实现。

3.1 Compile

Compile函数用于编译一个正则表达式,并返回一个可以用于匹配和查找操作的*Regexp对象。

func Compile(expr string) (*Regexp, error)

示例:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re, err := regexp.Compile(`abc`)
    if err != nil {
        fmt.Println("regexp.Compile error:", err)
        return
    }

    fmt.Println(re.MatchString("abc")) // true
}

输出:

true

3.2 MustCompile

MustCompile函数与Compile函数功能相同,但它会直接 panic 报错,而不是返回错误。

func MustCompile(expr string) *Regexp

示例:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`abc`)

    fmt.Println(re.MatchString("abc")) // true
}

输出:

true

3.3 MatchString

MatchString函数用于判断给定的字符串是否匹配正则表达式。

func (re *Regexp) MatchString(s string) bool

示例:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`abc`)

    fmt.Println(re.MatchString("abc")) // true
    fmt.Println(re.MatchString("def")) // false
}

输出:

true
false

3.4 FindString

FindString函数用于在给定的字符串中查找第一个匹配的子串,并返回该子串。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程