Golang系列:初识正则表达式

上次我们写了个并发程序,来抓取几个站点的网页内容,其中使用到了正则表达式来获取站点的域名部分,并作为文件名存储本地文件,今天,我们就来总结一下正则表达式的常用方法。

首先,在 Go 语言中,正则表达式相关的操作都封装在 regexp 这个包中,所以使用前需要引入该包。

下面我们来写个最简单的案例:

// regexp.go

package main

import (
    "fmt"
    "regexp"
)

func main() {
    // 是否匹配指定规则
    isMatch, _ := regexp.MatchString("^hel+o", "hello world")

    fmt.Println(isMatch)        // true
}

以上代码直接调用了 regexp.MatchString(regexpString, targetString) 方法,作用是检测字符串是否匹配指定的规则:以 hel+o 开头(其中 l 出现 1 ~ n 次)。

我们还可以先对正则表达式进行预编译,编译后可在后面程序中多次使用:

// regexp.go

package main

import (
    "fmt"
    "regexp"
)

func main() {
    // 预编译当前正则表达式
    re, _ := regexp.Compile("^hel+o")

    // 是否匹配指定字符串
    isMatch := re.MatchString("hello world")

    fmt.Println(isMatch)        // true

    // 获取查找结果
    result := re.FindString("hello world")

    fmt.Println(result)         // hello

    // 获取匹配结果的起始位置和结束位置索引
    indexResult := re.FindStringIndex("hello world")

    fmt.Println(indexResult)    // [0 5]
}

注意在上面程序中,MatchString() 方法只需传入目标字符串即可,另外,我们还使用 FindString() 方法在字符串中查找正则匹配到的子串,使用 FindStringIndex() 方法获取匹配结果出现的起始位置索引和结束位置的下一个索引。

当然,我们还可以对捕获组进行匹配:

// regexp.go

package main

import (
    "fmt"
    "regexp"
)

func main() {
    // 带捕获组的正则
    re, _ := regexp.Compile("h(\\w+)o")

    // 匹配捕获组
    subResult := re.FindStringSubmatch("hello world")

    fmt.Println(subResult)      // [hello ell]

    indexResult := re.FindStringSubmatchIndex("hello world")

    fmt.Println(indexResult);   // [0 5 1 4]
}

程序中返回了匹配项内容和捕获组内容,以及各自的索引信息。

在上面几段代码中,都使用了 regexp.Compile(regexpString) 方法对正则字符串进行预编译,我们还可以调用 regexp.MustCompile(regexpString) 来做同样的操作,区别在于,后者只返回一个结果,可作为常量使用:

// regexp.go

package main

import (
    "fmt"
    "regexp"
)

// MustCompile方法只返回一个结果 可作为常量
var RE = regexp.MustCompile("Jack")

func main() {
    // 目标字符串
    target := "Jack and Jack's friend"

    // 替换操作
    result := RE.ReplaceAllString(target, "John")

    fmt.Println(result);  // John and John's friend
}

上面代码中,我们定义了正则常量,然后调用 ReplaceAllString() 对目标字符串进行了替换操作。

关于正则表达式,就先写这么多,其实还有很多内容,后续再做总结。

转载于:https://www.cnblogs.com/liuhe688/p/9602396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值