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

时间: 2024-10-31 13:40:03

Golang系列文章:正则表达式的相关文章

Golang系列文章:打印命令行参数

记得最早在学校机房学习Java时,写一个最简单main方法,当程序运行并在屏幕上打印出hello world时,内心还有些小激动呢,相信很多人都有这种经历吧.今天想借助命令行程序,总结一下Go语言的基础知识点. 首先,来一个Go语言版的hello world: // hello.go package main import "fmt" func main() { fmt.Println("hello world") } 我们可以直接在命令行执行下面的命令来运行该程序

Golang系列文章:读取并统计文件内容

上次我们从命令行接收输入,并统计了每次输入内容出现的次数,今天对程序加以改造,使其能够读取文件内容,并统计每行文本出现的次数. 首先,我们把接收输入的逻辑封装成一个函数: // scan.go package main import ( "os" "fmt" "bufio" ) func main() { counts := make(map[string]int) fmt.Printf("Please type in somethin

Golang系列文章:抓取网页内容

今天写个简单的程序,根据指定的URL来抓取相应的网页内容,然后存入本地文件.这个程序会涉及到网络请求和文件操作等知识点,下面是实现代码: // fetch.go package main import ( "os" "fmt" "net/http" "io/ioutil" ) func main() { url := os.Args[1] // 根据URL获取资源 res, err := http.Get(url) if er

一个关于unity3d的系列文章

写在前面 想来从事unity3d开发已有三年多一些,寻思着该为这个奋斗了这么久的行业做些少许贡献,无赖自身水平局限加上各种拖延症,一直未能实施. 该写什么? 该怎么写? 不知道自己的能力是否能够撑起梦想,最后是否会太监? 也不会做需求分析,自己的文章会否有人问津? 更加不知道文章是否书写正确,不要传递了错误的信息,误人技术,徒留一地鸡毛. 想的多了,做得就少了,越想越无法下笔,但近日开始接手一个陈旧的项目,看着自己无法下手的代码,看着各种解不开的变量关系,才知道,虽然unity3d大大降低了做游

《PHP基础知识总结》系列文章归档

<PHP基础知识总结>系列文章归档 总结PHP基础知识,对初学者还是高手都值得参考巩固. 1PHP检查库或函数是否可用的方法 2关于PHP5 Session生命周期介绍 3PHP页面和Mysql数据库的转UTF8编码问题总结 4WAMP5的配置问题 5揭秘PHP深受Web开发者喜爱的原因 6php获取客户端电脑屏幕参数的方法 7PHP中浮点数计算比较及取整不准确的解决方法 8对于PHP中命名空间概念的入门理解 9php5.4以下版本json不支持不转义内容中文的解决方法 10PHP相关面试中最

重学Golang系列(一): 深入理解 interface和reflect

前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一次梳理,也算是我阶段学习的总结,以期温故而知新. interface(接口) 定义 在Go语言中,如果自定义类型(比如struct)实现了某个interface中的所有方法,那么就可以说这个类型实现了这个接口.接口可如下定义: type 接口名称 interface { method1(参数列表)

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

Jenkins pipeline 入门到精通系列文章

Jenkins2 入门到精通系列文章. Jenkins2 下载与启动jenkins2 插件安装jenkins2 hellopipelinejenkins2 pipeline介绍jenkins2 javahelloworldjenkins2 groovy入门jenkins2 pipeline入门jenkins2 pipeline高级jenkins2 Jenkinsfilejenkins2 multibranchjenkins2 Jenkinsfile和loadjenkins2 groovy脚本参考

saltstack之基础入门系列文章简介

使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文章主要讲述了saltstack的安装.远程执行.配置管理.数据系统以及jinjia模板等知识点,从第七篇往后的文章是一些使用saltstack的案例,包括系统初始化,rpm包以及源码安装等. 博客中saltstack系列的文章,适合初学者从零开始学习直到逐渐熟练使用.文章具有一定的连贯性,如果没有任