Go学习之regexp包学习

2023-05-16

Go中regexp包主要存放的是处理正则表达式相关的结构和处理函数,具体的函数原型可以在GOROOT中寻找相应的包查看,下面只是给出各个不同的函数的功能和使用方法,正则表达式的基本概念可以查看正则表达式基本概念学习总结

package main

import (
	"fmt"
	"regexp"
	"github.com/glog"
	"bytes"
)

//Compile——判断一个正则表达式是否合法,采用最左最短匹配
FindString——在传入字符串中查找正则表达式匹配的内容,并返回第一个匹配的对象
func TestCompile() {
	ret, err := regexp.Compile(`^[0-9]`)
	if err != nil {
		glog.Infoln(err)
	}
	fmt.Println(ret.FindString("2312eweqeqw"))
}

//CompilePOSIX——和complie一样,使用的是POSIX语法规则,采用最左最长匹配
func TestCompilePOSIX() {
	ret, err := regexp.CompilePOSIX(`[[:word:]]+`)
	if err != nil {
		glog.Infoln(err)
	}
	fmt.Printf("%q\n", ret.FindString("hello world"))
}

//MustCompilePOSIX和CompilePOSIX作用一样,不一样的是当正则表达式不合法的时候会报出异常而不是错误
func TestMustCompilePOSIX()  {
	ret := regexp.MustCompilePOSIX(`[[:word:]].+`)
	fmt.Printf("%q\n", ret.FindString("hello world"))
}

//统计正则表达式中分组的个数
func TestNumSubexp()  {
	ret := regexp.MustCompile(`(?U)(?:Hello)(\s+)(\w+)`)
	fmt.Printf("%q\n", ret.NumSubexp())
}
//SubexpNames——返回正则表达式中的分组名称,一个圆括号表示一个分组
//返回值[0]为整个表达式的名称
//返回值[1]为分组1的名称,其余依次向后推
func TestSubexpNames()  {
	ret := regexp.MustCompile("(?:Hello)([321])(\t)()(World)")
	fmt.Printf("%q\n", ret.SubexpNames())
}

//LiteralPrefix——返回所有匹配项共同拥有的前缀(去除可变元素)
//返回值说明:第一个返回值表示共同拥有的前缀,第二个表达式看是不是正则表达式如果是正则表达式返回true,否则返回false
func TestLiteralPrefix()  {
	ret := regexp.MustCompile(`Hello[\w\s]`)
	fmt.Println(ret.LiteralPrefix())
	ret = regexp.MustCompile(`hello`)
	fmt.Println(ret.LiteralPrefix())
}

//MatchRead——判断在r中能否找到正则表达式所匹配的子串
//参数描述:第一个表示要查找的正则表达式,第二个表示要在其中查找的RuneReader接口
//返回值描述:第一个返回值表示是否匹配到,匹配到了返回true否则返回false,第二个返回值为err
func TestMatchReader()  {
	ret := bytes.NewReader([]byte("jgdsafu gfjasgfgs"))
	fmt.Println(regexp.MatchReader("j.*", ret))
}

//MatchString——判断在给定字符串中能否找到匹配的串
//参数描述:第一个参数为给定的正则表达式,第二个为给定的要匹配的文本串
//返回值描述:第一个返回值表示是否匹配,匹配到了返回true,否则返回false,第二个返回值表示error
func TestMatchString() {
	fmt.Println(regexp.MatchString(`^[123]`, "13221"))
}

//Match——判断在给定[]byte中能否找到正则表达式所匹配的子串
//参数说明:第一个参数为给定的正则表达式,第二个参数为给定的要查找的文本
//返回值说明:第一个表示正则表达试是否有匹配,第二个参数为error
func TestMatch()  {
	fmt.Println(regexp.Match(`[e]`, []byte("321cwxfsfsdfs")))
}

//ReplaceAllString——将检索到的匹配项替换为给定的,并返回替换后的结果
func TestReplaceAllString()  {
	str := "ewq 413, 4324, dsGuds Go"
	ret := regexp.MustCompile(`(Hell|G)o`)
	rep := "{1}ooo"
	fmt.Printf("%q\n", ret.ReplaceAllString(str, rep))
}

//ReplaceAllLiteralString——在给定文本中搜索,并将给定文本替换为第二个参数给定的内容
//参数描述:第一个参数表示给定的文本,第二个参数表示给的需要替换的内容(如果其中含有分组引用符,将分组引用符当做普通字符处理)
//返回值描述:返回替换后的文本,
func TestReplaceAllLiteralString()  {
	src := "231 213 fdshof fgodsugi Go qhwie hifewir"
	reg := regexp.MustCompile(`(fg|hi|sh|G)o`)
	rep := "${1}AAA"
	fmt.Printf("%q\n", reg.ReplaceAllLiteralString(src, rep))
}


//QuoteMeta——将字符串中的特殊字符转换为其转义格式(特殊字符包括——\.+*?()|[]{}^$)
func TestQuoteMeta()  {
	fmt.Println(regexp.QuoteMeta("^ewq[312]+(?:32){32|1}.*fsd$"))
}

//Find——在给定文本中查找正则表达式中匹配的内容,并返回第一个匹配的对象
func TestFind() {
	reg := regexp.MustCompile(`\w+`)
	fmt.Printf("%q\n", reg.Find([]byte("f11gdsgfs dfjdgsu")))
}

//FndIndex——在给定文本中查找匹配正则表达式的内容,并返回匹配内容的起始位置和结束位置[起始位置 结束位置]
func TestFindIndex() {
	reg := regexp.MustCompile(`\w+`)
	fmt.Println(reg.FindIndex([]byte("43242324 432432")))
}

//FindStringIndex——在给定文本中查找满足正则表达式的串并返回第一个匹配串的起始和结束位置

//FindSubmatch——在文本中查找正则表达式被匹配的第一个内容,同时返回子表达式匹配的内容{{完整匹配项}{起始子匹配项}{结束子匹配项}}
func TestFindSubmatch()  {
	reg := regexp.MustCompile(`(\w)(\w)+`)
	fmt.Printf("%q\n", reg.FindSubmatch([]byte("ewewqx 423")))
}

//Expand——将template的内容处理之后追加到dst尾部,template中要有$1、$2、${name1}、${name2}这样的分组引用符
//match是由FindSubmatchIndex方法返回的结果,里面存放了各个位置的信息,如果template中有match信息,则以match为标准
//在src中取出相应的子串,替换掉template中的$1、$2等引用符号
func TestExpand()  {
	reg := regexp.MustCompile(`(\w+),(\w+)`)
	src := []byte("Golang,World!") // 源文本
	dst := []byte("Say: ") // 目标文本
	template := []byte("Hello $1, Hello $2") // 模板
	match := reg.FindSubmatchIndex(src) // 解析源文本
	// 填写模板,并将模板追加到目标文本中
	fmt.Printf("%q\n", reg.Expand(dst, template, src, match))
	// "Say: Hello Golang, Hello World"
}

//ExpandString——功能和Expand一样,只不过参数类型换成了string

//Split——在给定文本项中搜索匹配项,并以匹配项为分割符,将s分割成多个子串,最多分割成多个子串,第n个子串不在进行分割
//如果n<0,则分割所有的子串,返回分割后的子串列表
func TestSplit() {
	src := "Hello World\t31321\nGolang"
	reg := regexp.MustCompile(`\s`)
	fmt.Printf("%q\n", reg.Split(src, -1))
}

func main()  {
	TestCompile()
	TestCompilePOSIX()
	TestMustCompilePOSIX()
	TestNumSubexp()
	TestSubexpNames()
	TestLiteralPrefix()
	TestMatchReader()
	TestMatchString()
	TestMatch()
	TestReplaceAllString()
	TestReplaceAllLiteralString()
	TestQuoteMeta()
	TestFind()
	TestFindIndex()
	TestFindSubmatch()
	TestExpand()
	TestSplit()
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go学习之regexp包学习 的相关文章

  • 问答QA(一)综述

    声明 xff1a 本文是综合网上问答系统介绍 xff0c 做的总结 xff0c 如有侵权 xff0c 请联系处理 xff0c 谢谢 一 问答系统架构 1 1 问题分析模块 负责对用户的提问进行处理 xff1b 生成查询关键词 xff08 提
  • 【程序员面试宝典】栈和队列相关面试题

    1 集合栈 题目描述 xff1a 请实现一种数据结构SetOfStacks xff0c 由多个栈组成 xff0c 其中每个栈的大小为size xff0c 当前一个栈填满时 xff0c 新建一个栈 该数据结构应支持与普通栈相同的push和po
  • 【程序员面试宝典】栈的应用

    1 下一个较大元素 现在我们有一个int数组 xff0c 请你找出数组中每个元素的下一个比它大的元素 给定一个int数组A及数组的大小n xff0c 请返回一个int数组 xff0c 代表每个元素比他大的下一个元素 若不存在则为 1 保证数
  • time_wait与面试的暧昧

    背景知识 TCP三次握手与四次挥手 http blog csdn net double happiness article details 70160738 time wait是什么 xff1f 通过上面三次握手和四次挥手的学习 xff0c
  • 【通信方式五】socket编程之TCP通信

    1 网络字节序 网络字节序就是熟知的关于大小端的问题 xff0c 关于前面的大小端的判断方法 xff0c 以及代码实现再此就不在赘述 xff0c 下面只谈网络中的字节序问题 xff08 如何判定当前机器的大小端 xff1a http blo
  • 【通信方式六】socket编程之UDP通信

    相关博客 通信方式五 socket编程之TCP http blog csdn net double happiness article details 74938008 由于TCP协议是可靠的面向连接的协议 xff0c 因此在服务器端需要执
  • shell下的第一个编程(不一样的1到100累加)

    相信对于一个程序 猿 来说 xff0c 除了我们入门的 hello world 之外 xff0c 最简单的代码就是只有从1累加到100这样简单的程序吧 xff0c 没错这样的程序在现在来看或许根本不如我们的法眼 xff0c 那么问题来了 x
  • 【每日一题-1】有序链表合并与累加和问题

    基础题 合并两个有序链表 xff0c 合并以后的链表依旧有序 思路 xff1a xff08 1 xff09 特殊情况处理 xff1a 若两个链表都为则返回空 xff0c 若其中一个链表为空返回另外一个链表的头结点 xff1b xff08 2
  • 【每日一题-2】链表基础面试题

    1 查找链表的倒数第k个节点 span style font family none font size 12px ListNode FindKthToTail ListNode pListHead unsigned int k if pL
  • 【每日一题-3】链表带环问题

    判断链表是否带环 xff1f 如果带环 xff0c 环的长度是多少 xff1f 环的入口节点是什么 xff1f span style font family none font size 12px struct ListNode int v
  • Linux更改镜像源

    https mirrors tuna tsinghua edu cn span class token comment 清华大学镜像源 span span class token comment 1 搜索Ubuntu span span c
  • 【每日一题-5】复杂链表的复制

    逆序打印单链表 span style font family none font size 12px void ReversePrintList listNode pHead if pHead 61 61 NULL return NULL
  • 【每日一题-6】栈和队列与替换空格

    两个栈实现一队列 span style font family none font size 12px class Queue void Push int data inStack push data int Pop if inStack
  • HTTP协议详解(真的很牛逼)

    引言 HTTP是一个属于应用层的面向对象的协议 xff0c 由于其简捷 快速的方式 xff0c 适用于分布式超媒体信息系统 它于1990年提出 xff0c 经过几年的使用与发展 xff0c 得到不断地完善和扩展 目前在WWW中使用的是HTT
  • shell下的命令代替

    命令替换是指Shell 执行命令并将命令替换部分替换为执行该命令后的结果 shell下的命令代替为 34 96 96 xff08 反引号 xff09 34 和 34 34 使用单反引号的替换方式 执行结果 替换成 的方式 执行结果 两种命令
  • getopt函数簇

    xff08 一 xff09 在Linux中 xff0c 用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题 xff0c 例如 xff1a a out a1234 b432 c d 程序会根据读取的参数执行相应的操作 xff0c 在
  • 【每日一题-8】出栈入栈合法性与二进制中1的个数

    元素出栈 入栈顺序的合法性 如 xff1a 入栈的序列 xff08 1 2 3 4 5 xff09 xff0c 出栈序列为 xff08 4 5 3 2 1 xff09 xff0c 则合法 入栈的序列 xff08 1 2 3 4 5 xff0
  • 【每日一题-9】层序遍历与N!后的0的个数

    实现一颗二叉树的层序遍历 span style font family none font size 12px typedef struct Node int val struct Node left struct Node right N
  • 【每日一题-10】求第K层节点与求数组中出现一半的数

    strong span style font size 14px span style color rgb 51 51 51 font family none 求二叉树第k层的节点个数 span span strong span style
  • 【每日一题-11】求二叉树高度/销毁一棵二叉树与链表翻转

    求二叉树的高度 span style font family none font size 12px int TreeDepth Node root if root 61 61 NULL return 0 if root gt left 6

随机推荐

  • 更新数据时redis缓存与数据库数据不一致的问题

    最初级的缓存不一致问题及解决方案 问题 xff1a 先修改数据库 xff0c 再删除缓存 如果删除缓存失败了 xff0c 那么会导致数据库中是新数据 xff0c 缓存中是旧数据 xff0c 数据就出现了不一致 解决思路 xff1a 先删除缓
  • 【每日一题-12】平衡二叉树/镜像与杨氏矩阵查找

    判断一棵二叉树是否是平衡二叉树 span style font family none font size 12px typedef struct TreeNode int val struct TreeNode left struct T
  • 【每日一题-13】二叉树中查找节点/子树

    在二叉树中查找一个节点 span style font family none font size 12px struct TreeNode int data TreeNode left TreeNode right TreeNode in
  • 【每日一题-14】完全二叉树&寻找最近公共节点

    判断一棵树是否是完全二叉树 判断依据 xff1a 完全二叉树的前k层都是满的 xff0c 最后一层从左到右都是满的 xff0c 如果不符合该规则则不是完全二叉树 span style font family none font size 1
  • 【每日一题-15】二叉树非递归遍历&求两个集合的差集

    实现二叉树的前序 中序 后序非递归遍历 span style font family none font size 12px include lt stack gt struct Node int val struct Node left
  • 【每日一题-16】重建二叉树&C模拟实现C++继承多态

    由前序遍历和中序遍历重建二叉树 span style font family none font size 12px void reBuildTree vector lt int gt pre int begin1 int end1 vec
  • 【每日一题-17】线索化二叉树与单例模式

    将二叉搜索树转换成一个排序的双向链表 提示 xff1a 要求不能创建任何新的结点 xff0c 只能调整树中结点指针的指向 xff0c 也就是left当prev xff0c right当next 中序线索化的变型 span style fon
  • go学习笔记(1)——感悟

    在接触到go语言之前 xff0c 我本人一直学习的是C C 43 43 语言 xff0c 本想着凭借原有的语言功底能够很快的去自学任何一门新的编程语言 xff0c 只不过渣小白毕竟还是渣 xff0c go语言的更新对于其他语言的一些继承和更
  • go学习笔记(2)——go环境安装及代码包说明

    Linux下go的环境变量的配置 首先将下载的go的安装包解压到 usr local中 xff08 1 xff09 下载方法 xff1a go 1 8 Linux x86 64 下载 wget http ark mytorchwood co
  • go学习笔记(3)——go命令行

    go命令行清单 在安装好go机器上的Terminal中输入 go help 命令 xff1a Usage go command arguments The commands are build compile packages and de
  • go学习笔记(4)——比较两个类型相等

    字符串比较方法 xff1a xff08 1 xff09 61 61 xff1a 逐个比较且不分大小写 xff0c 相等返回true xff0c 不相等返回false fmt Println 34 你好 34 61 61 34 你好 34 t
  • 2021年校招软件测试工程师经典面试题,月薪15K你需要掌握哪些知识点?

    软件测试工程师 xff0c 和开发工程师相比起来 xff0c 前期可能不会涉及太深奥的内容 xff0c 但是涉及的面还是比较广的 面试实习生或者一年左右的岗位 xff0c 问的也主要是一些基础性的问题比较多 涉及的知识主要有MySQL数据库
  • CCF2021-9-19

    一共五道题目 xff0c 可以带参考书和纸笔进考场 xff0c 忘了带纸笔 xff0c 带了本参考书没用上 xff0c 总体做的情况不太好 第一题和第二题都是使用数组 xff0c 第一道题拿了满分 xff0c 第二题70 xff0c 后面数
  • go学习笔记(5)——字符串拼接方法

    字符串拼接清单 xff1a xff08 1 xff09 使用 43 61 运算符直接进行拼接 xff1a 需要注意的是 xff0c go语言拼接的两个对象必须得全部都是字符串类型 xff0c 否则会出现直接报类型不匹配的错误 xff0c 关
  • go学习笔记(6)——音乐播放器实现

    声明 xff1a 首先说明这个项目来自于许式伟的 Go语言编程 xff0c 书中也给出了详尽的源代码描述 xff0c 不过代码中还是存在一些问题 xff0c 首先说明一下所存在的问题 问题一 xff1a 音乐的播放结构体中定义了五个属性字段
  • Go格式化输出

    1 GO数据类型转化为JSON类型 函数原型 xff1a func Unmarshal data byte v interface err GO数据类型输出为JSON类型示例 package main import 34 encoding
  • C学习回顾1

    1 求下面程序的输出 include lt stdio h gt int main int i 61 43 printf 34 d n 34 printf 34 d 34 printf 34 d 34 i 4321 return 0 结果分
  • golang Unmarshal拿不全数据问题

    说明 xff1a 这个问题出现在后端调用json Unmarshal方法去解析数据库中存的数据时 xff0c 解析出来的结果中只能拿到部分数据 xff0c json格式经检查后正确无误 xff0c 同时也没有字段名出错等低级错误 首先来看要
  • Golang开发新手常犯的50个错误

    50 Shades of Go Traps Gotchas and Common Mistakes for New Golang Devs 原文地址 xff1a http devs cloudimmunity com gotchas and
  • Go学习之regexp包学习

    Go中regexp包主要存放的是处理正则表达式相关的结构和处理函数 xff0c 具体的函数原型可以在GOROOT中寻找相应的包查看 下面只是给出各个不同的函数的功能和使用方法 xff0c 正则表达式的基本概念可以查看正则表达式基本概念学习总