当前位置: 首页 > news >正文

非零基础自学Golang 第16章 正则表达式 16.3 regexp包 16.4 小结 16.5 知识拓展

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第16章 正则表达式
        • 16.3 regexp包
          • 16.3.1 MatchString函数
          • 16.3.2 FindStringIndex函数
          • 16.3.3 ReplaceAllString函数
        • 16.4 小结
        • 16.5 知识拓展
          • 16.5.1 常用正则表达式参考

第16章 正则表达式

16.3 regexp包

Go在处理正则表达式时主要使用regexp包,包中实现了正则表达式的查找、替换和模式匹配功能。

16.3.1 MatchString函数

MarchString函数接收一个要查找的正则表达式和目标字符串,并根据匹配结果返回true或false,函数定义如下:

func MatchString(pattern string, s string) (matched bool, err error)

对于目标字符串“hello world”,我们通过MatchString函数匹配其中的“hello”字符串,并返回匹配结果:

[ 动手写 16.3.1]

package main

import (
   "fmt"
   "regexp"
)

func main() {

   targetString := "hello world"
   matchString := "hello"

   match, err := regexp.MatchString(matchString, targetString)

   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(match)
}

运行结果

在这里插入图片描述

程序执行结果表明匹配成功。那么,如果我们把目标字符串改为“Hello world”,匹配是否会成功呢?

[ 动手写16.3.2 ]

package main

import (
   "fmt"
   "regexp"
)

func main() {

   targetString := "Hello world"
   matchString := "hello"

   match, err := regexp.MatchString(matchString, targetString)

   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(match)
}

运行结果

在这里插入图片描述

匹配结果显示失败了,由于正则表达式区分大小写,如果要以不区分大小写的方式查找,必须修改正则表达式,使用一种特殊的语法:

matchString := "(?i)hello"

字符串开头的语法让正则表达式匹配时不区分大小写,运行修改后的示例,结果为true。

[ 动手写 16.3.3 ]

package main

import (
   "fmt"
   "regexp"
)

func main() {

   targetString := "Hello world"
   matchString := "(?i)hello"

   match, err := regexp.MatchString(matchString, targetString)

   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(match)
}

运行结果

在这里插入图片描述

没毛病。

16.3.2 FindStringIndex函数

FindStringIndex函数接收一个目标字符串,并返回第一个匹配的起始位置和结束位置,函数定义如下:

func (re *Regexp) FindStringIndex(s string) (loc []int)

由于FindStringIndex函数是Regexp结构体的成员函数,需要对正则表达式进行编译,编译成功后方能使用。

通常使用Compile或MustCompile函数进行编译。

  1. Compile函数:若正则表达式未通过编译,则返回错误。
  2. MustCompile函数:若正则表达式未通过编译,则引发panic。

对于目标字符串“hello world”,我们通过FindStringIndex函数匹配其中的“hello”字符串对应的起始和结束位置:

[ 动手写 16.3.4]

package main

import (
   "fmt"
   "regexp"
)

func main() {

   targetString := "hello world"
   re := regexp.MustCompile(`(\w)+`)

   res := re.FindStringIndex(targetString)
   fmt.Println(res)
}

运行结果

在这里插入图片描述

16.3.3 ReplaceAllString函数

ReplaceAllString函数返回第一个参数的拷贝,将第一个参数中所有re的匹配结果都替换为repl,函数定义如下:

func (re *Regexp) ReplaceAllString(src, repl string) string

同样对于目标字符串“hello world”,我们通过ReplaceAllString函数匹配其中的“o”字符并将其替换为“O”:

[ 动手写 16.3.5]

package main

import (
   "fmt"
   "regexp"
)

func main() {

   targetString := "hello world"
   re := regexp.MustCompile(`o`)

   res := re.ReplaceAllString(targetString, "O")
   fmt.Println(res)
}

运行结果

在这里插入图片描述

没毛病。

16.4 小结

  • 正则表达式是符合一定规则的表达式,用于匹配字符串中字符组合的模式。
  • 正则表达式的设计思想就是使用一些描述性的符号和文字为字符串定义一个规则。凡是符合这个规则的,程序就认为文本是“匹配”的,否则就认为文本是“不匹配”的。
  • Go在处理正则表达式时主要使用regexp包,包中实现了正则表达式的查找、替换和模式匹配功能。

16.5 知识拓展

16.5.1 常用正则表达式参考

【1】E-mail 地址

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

【2】URL 地址

^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-])\/?$

【3】匹配首尾空白字符的正则表达式

^\s|\s$

【4】手机号码

^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$

【5】电话号码

^(\d{3,4}-)?\d{7,8}$

【6】18位身份证号码(数字、字母x结尾)

^((\d{18})|([0-9x]{18})|([0-9X]{18}))$

【7】账号是否合法(5~16字节,允许字母、数字、下划线,以字母开头)

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

【8】一年的12个月(01~09和1~12)

^(0?[1-9]|1[0-2])$

【9】日期格式(2018-01-01只做粗略匹配,格式不限制,二月有30天等)

^\d{4}-\d{1,2}-\d{1,2}$

【10】一个月的31天(01~09和1~31)

^((0?[1-9])|((1|2)[0-9])|30|31)$

【11】IP 地址

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

相关文章:

  • 北京网络电话/拼多多关键词优化步骤
  • 做微商怎样加入网站卖东西赚钱/房地产市场现状分析
  • 雄安做网站要多少钱/免费制作永久个人网站
  • 专业设计vi公司/seo学校培训
  • 网站设计高端/网络营销和推广做什么
  • wordpress主题限速/湖南长沙今日疫情
  • Linux系统 PHP安装expect扩展详解
  • (二十)Vue之非单文件组件
  • always块中时序逻辑 negedge rst_n和posedge rst实际电路
  • es笔记五之term-level的查询操作
  • 用简单伪随机数发生器实现随机中点位移分形(Matlab代码实现)
  • Macos安装和卸载第三方软件的正确方法
  • 02-Spring Boot启动原理核心源码剖析
  • 数据库实验5 数据库设计实验
  • Opencv(C++)笔记--直方图均衡化、直方图计算
  • spring-statemachine状态机梳理
  • ListView的基本创建方式
  • Navicat--对比和同步MySQL表结构的方法