Go常用正则函数整理

news2024/9/25 13:14:03

前言

在Go语言中,标准库regexp提供了丰富的API来处理正则表达式,支持编译、匹配、查找、替换等操作。以下是一个Go标准库正则函数的常用大全教程及部分使用示例。
在这里插入图片描述

Go标准库常用正则函数

  1. Compile:编译正则表达式,返回一个可用于匹配、查找、替换等操作的*Regexp对象。
  2. MustCompile:功能与Compile相同,但在正则表达式无法编译时会引发panic。
  3. Match:检查字节切片中是否存在匹配正则表达式的子序列。
  4. MatchString:检查字符串中是否存在匹配正则表达式的子串。
  5. Find:在字节切片中查找正则表达式的第一个匹配项,并返回匹配项的位置和子匹配项。
  6. FindString:在字符串中查找正则表达式的第一个匹配项,并返回该匹配项。
  7. FindAll:在字节切片中查找正则表达式的所有匹配项,并返回它们的位置和子匹配项。
  8. FindAllString:在字符串中查找正则表达式的所有匹配项,并返回它们的切片。
  9. ReplaceAll:在字节切片中查找正则表达式的所有匹配项,并将它们替换为指定的替换字符串,返回新的字节切片。
  10. ReplaceAllString:在字符串中查找正则表达式的所有匹配项,并将它们替换为指定的替换字符串,返回新的字符串。
  11. ReplaceAllLiteralString:与ReplaceAllString类似,但不考虑替换字符串中的任何正则表达式元字符。
  12. Expand:根据正则表达式匹配的结果和模板字符串来构造一个新的字符串。
  13. QuoteMeta:将字符串中的特殊正则表达式元字符转义,以便它们可以被视为普通字符。

使用示例

示例1:编译并匹配字符串
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re, err := regexp.Compile(`\d+`)
    if err != nil {
        panic(err)
    }
    fmt.Println(re.MatchString("Hello 123, this is a test.")) // 输出: true
}
示例2:查找并替换字符串中的数字
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\d+`)
    result := re.ReplaceAllString("Price: 100 USD, Discount: 20%", "XXX")
    fmt.Println(result) // 输出: Price: XXX USD, Discount: XXX%
}
示例3:提取子匹配项
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(\w+)-(\d+)`)
    str := "user-1234"
    matches := re.FindStringSubmatch(str)
    if len(matches) > 0 {
        fmt.Println("Full match:", matches[0])    // Full match: user-1234
        fmt.Println("User:", matches[1])          // User: user
        fmt.Println("ID:", matches[2])            // ID: 1234
    }
}
示例4:逐行匹配
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(?m)^go.*$`)
    str := "go is fun\nhello\ngo again"
    matches := re.FindAllString(str, -1)
    fmt.Println(matches) // 输出: [go is fun go again]
}

示例5:使用FindAllString提取所有匹配项

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\b\w+\b`) // 匹配单词边界之间的单词字符序列
    str := "Hello, world! This is a test."
    matches := re.FindAllString(str, -1) // -1 表示查找所有匹配项
    fmt.Println(matches) // 输出: [Hello world This is a test]
}

示例6:使用Expand根据模板替换

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(\w+), (\w+)!`)
    src := "Alice, Bob! Hello, World!"
    result := re.ExpandString(nil, "Hi $2, $1!", re.FindStringSubmatch(src))
    fmt.Println(result) // 输出: Hi Bob, Alice!
}

示例7:使用Split按正则表达式分割字符串

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\s+`) // 匹配一个或多个空白字符
    str := "Hello    world!    This   is   a   test."
    parts := re.Split(str, -1) // -1 表示分割所有匹配项
    fmt.Println(parts) // 输出: [Hello world! This is a test.]
}

示例8:使用FindStringIndex获取匹配项的位置

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\d+`) // 匹配一个或多个数字
    str := "There are 123 apples and 456 oranges."
    loc := re.FindStringIndex(str)
    if loc != nil {
        fmt.Printf("Found at: %d to %d\n", loc[0], loc[1])
        fmt.Printf("Matched text: %s\n", str[loc[0]:loc[1]])
    }
    // 输出:
    // Found at: 7 to 10
    // Matched text: 123
}

示例9:使用FindAllStringIndex获取所有匹配项的位置

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\b\w+\b`) // 匹配单词
    str := "Hello, world! This is a test."
    indices := re.FindAllStringIndex(str, -1)
    for _, loc := range indices {
        fmt.Printf("Found at: %d to %d\n", loc[0], loc[1])
    }
    // 输出所有单词的位置
}

示例10:使用CompilePOSIX编译POSIX风格的正则表达式

虽然CompilePOSIX在现代Go程序中使用较少,因为它限制了正则表达式的功能,但以下是一个示例:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re, err := regexp.CompilePOSIX(`^[a-zA-Z0-9]+$`)
    if err != nil {
        panic(err)
    }
    matched := re.MatchString("username123")
    fmt.Println(matched) // 输出: true
}

请注意,CompilePOSIX使用的是POSIX BRE(基本正则表达式)语法,与Go标准库中的Compile(使用Perl兼容的正则表达式语法)不同。
当然可以,以下是更多关于Go标准库regexp包的使用示例,涵盖了更广泛的功能和场景:

示例11:忽略大小写匹配

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(?i)hello`) // 使用(?i)标志来忽略大小写
    str := "Hello, world! hello again."
    matched := re.MatchString(str)
    fmt.Println(matched) // 输出: true
}

注意:虽然Go的regexp包本身没有直接的忽略大小写编译选项(如Python的re.IGNORECASE),但你可以通过在正则表达式内部使用(?i)标志(如果正则表达式引擎支持的话,但请注意Go的标准库并不直接支持(?i),这里只是为了说明概念。在Go中,你应该使用regexp.Compile时传入的regexp.IgnoreCase选项)。然而,Go的标准做法是在编译正则表达式时传递regexp.IgnoreCase选项:

re := regexp.MustCompile(`hello`, regexp.IgnoreCase)

示例12:使用NamedCaptureGroups捕获命名组

Go标准库的regexp包不直接支持命名捕获组(如Python的(?P<name>pattern)),但你可以通过索引来访问捕获组。不过,你可以通过命名你的正则表达式组来在代码中实现类似的功能,尽管这不是由正则表达式引擎直接支持的。

示例13:匹配电子邮件地址

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$`)
    emails := []string{
        "example@example.com",
        "invalid-email",
        "another.valid.email@domain.co.uk",
    }
    for _, email := range emails {
        if re.MatchString(email) {
            fmt.Println(email, "is a valid email")
        } else {
            fmt.Println(email, "is not a valid email")
        }
    }
}

示例14:替换字符串中的URL

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`https?://[\w./?=%&\-]+`)
    str := "Visit https://example.com or http://another.example.org for more info."
    result := re.ReplaceAllString(str, "[URL]")
    fmt.Println(result) // 输出: Visit [URL] or [URL] for more info.
}

示例15:使用SubexpNames(虽然Go标准库不直接支持)

由于Go标准库的regexp包不支持命名捕获组,因此没有SubexpNames方法。但是,你可以通过手动维护一个与你的正则表达式中捕获组相对应的名称映射来实现类似的功能。

示例16:使用ReplaceFunc进行更复杂的替换

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`\b\w+\b`)
    str := "Hello, world! This is a test."
    result := re.ReplaceAllStringFunc(str, func(match string) string {
        return strings.ToUpper(match)
    })
    fmt.Println(result) // 输出: HELLO, WORLD! THIS IS A TEST.
}

这个示例展示了如何使用ReplaceAllStringFunc方法来对每个匹配项执行一个自定义的替换函数,这里是将所有单词转换为大写。

总结

这些示例应该能够为你提供关于如何在Go中使用regexp包的更多想法和技巧。记得在实际应用中根据你的具体需求选择合适的函数和方法。在实际开发中,你可以根据具体需求选择合适的函数和方法。请注意,这里只提供了部分常用函数和示例。在实际应用中,regexp包的功能远不止于此,您还可以根据需要使用SplitFindIndexFindStringIndex等其他函数。此外,正则表达式的性能也是一个需要注意的问题。在设计正则表达式时,应尽量避免复杂的嵌套和回溯,以提高匹配效率。同时,对于需要频繁使用的正则表达式,建议使用CompileMustCompile进行预编译,以提高执行效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2126177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 构建报错 undefined reference to xxx

初次学习使用Qt&#xff0c;在构建时报错。这是个典型报错&#xff0c;熟练vs与c的朋友一眼就可以看出要么是库出问题了&#xff0c;要么是库链接出问题了。那么就可以按照相对明确的方向找问题。 1、确认库与项目配置是否一致。32位还是64位&#xff0c;debug还是release一定…

如何逆转Instagram账号流量减少?4个实用技巧分享

Instagram作为全球十大社媒之一&#xff0c;不仅是个人分享生活的平台&#xff0c;还是跨境卖家进行宣传推广和客户开发的关键工具。在运营Instagram的过程中&#xff0c;稍有不慎就容易出现账号被限流的情况&#xff0c;对于账号状态和运营工作的进行都十分不利。 一、如何判断…

new String(),toString()和Arrays.toString()的区别

下面写了一段代码来展示结果 import javax.sound.midi.Soundbank; import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {String str "abc";System.out.println("str:"str);char[] chars st…

若楠带你初识OpenCV(7) -- 轮廓检测之银行卡号识别

文章目录 银行卡号识别详细流程一、设置参数二、函数准备三、具体步骤1. 得到每个数字的信息2. 银行卡处理3. 找到数字边框4. 模板匹配 总结 银行卡号识别 经过了几篇关于轮廓检测的学习&#xff0c;本篇我们来尝试完成对银行卡号的检测识别&#xff1a; 目标&#xff0c;识别…

获取时间,并将时间按一定的格式输出

一、时间函数 1.获取秒数 CTS 北京时间 2.转换为需要个格式 系统时间的获取: 1.time 获得秒数 time_t time(time_t *t); time_t 类型变量 第一种 准备一个变量 time_t tm; time(&tm) 第二种 tm time(NULL); 功能: 获得1970年到现在的秒数 第一步&#xff0c;先获得秒…

OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

JavaScript基础语法(超详细!)

为什么学JS&#xff1f; 1.页面动态效果 2.表单验证 可以包含在文档中的任何地方&#xff0c;只要保证这些代码在被使用前已读取并加载到内存即可 <script>… </script>网页中引用JavaScript的方式&#xff1a; 1.使用<script>标签外部JS文件 <scrip…

层归一化(201607)

Layer Normalization 层归一化 https://arxiv.org/abs/1607.06450 Abstract Training state-of-the-art, deep neural networks is computationally expensive. One way to reduce the training time is to normalize the activities of the neurons. A recently introduced…

gdb 前端:kdbg 安装使用

文章目录 1. 前言2. kdbg 安装使用2.1 安装 kdbg2.2 使用 kdbg 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. kdbg 安装使用 2.1 安装 kdbg kdbg 是 gdb 的图形化界面的前端&#xff0c;在 …

2018年系统架构师案例分析试题五

目录 案例 【题目】 【问题 1】(7 分) 【问题 2】(12 分) 【问题 3】(6 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某银行拟将以分行为主体…

多卡微调智谱glm-4-9b-chat

1 什么是微调&#xff1a; 大模型微调&#xff08;Fine-tuning of large models&#xff09;是一种通过对已经训练好的大规模预训练模型进行进一步训练的技术&#xff0c;以便让模型在特定任务或特定领域上表现得更好。微调通常是在已经有了一个通用的、经过大规模数据训练的基…

恐怖类游戏智能体————恐怖探险家

智能体名称&#xff1a;恐怖探险家 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/center/agent/preview/MFhBvA0K9EXXVdjHCcUumadWmWesKvw2 角色与目标设定 &#x1f9d1;&#x1f3fb; 角色&#xff1a;恐怖探险家是一位…

2.快速部署一个Kubernetes集群

&#x1f482; 个人主页: Java程序鱼 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏(一键三连)和订阅专栏 &#x1f464; 微信号&#xff1a;hzy1014211086&#xff0c;想加入技术交流群的小伙伴可以加我好友&#xff0c;群里会分享学习资料、学习方法…

Unity人工智能开发学习心得

在Unity中进行人工智能研究与应用主要集中在几个关键领域&#xff0c;包括使用Unity ML-Agents插件进行强化学习、利用神经网络技术和深度学习技术训练AI&#xff0c;以及基于行为树技术设计游戏人工智能。 ‌使用Unity ML-Agents插件进行强化学习‌&#xff1a;Unity ML-Agent…

网络安全 DVWA通关指南 DVWA Reflected Cross Site Scripting (反射型 XSS)

DVWA Reflected Cross Site Scripting (反射型 XSS) 文章目录 DVWA Reflected Cross Site Scripting (反射型 XSS)XSS跨站原理反射型 LowMediumHighImpossible 参考文献 WEB 安全靶场通关指南 XSS跨站原理 当应用程序发送给浏览器的页面中包含用户提交的数据&#xff0c;但没有…

Linux进阶命令-echodatealias

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

自然语言处理系列六十九》搜索引擎项目实战》搜索框架技术选型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十九搜索引擎项目实战》搜索框架技术选型搜索…

大模型结合知识库问答应用第一次实践

大模型结合知识库问答应用第一次实践 这份完整版的大模型 AI 学习资料已经上传CSDN&#xff0c;朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 记录一次用大模型LLM和向量数据库&#xff0c;搭建垂直领域的知识库问答实践。上文已经介绍了文本如…

第151天:红队APT-钓鱼篇邮件钓鱼SPF绕过自建邮件系统SwaksGophish

案例一&#xff1a;邮件钓鱼-前置知识 现在很多大型网站的邮件服务器已经做的很安全了&#xff0c;文中的很多方法感觉已经不适用&#xff0c;学习思路遇到公司自己搭建的邮件服务器可以尝试把 SPF 发件人策略框架&#xff08; Sender Policy Framework &#xff09;电子邮件认…

移植案例与原理 - utils子系统之file文件操作部件

往期知识点记录&#xff1a; 往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 startup子系统之syspara_lite系统属性部件 &#xff08;1&#xff09; startup子系统之syspara_lite系统属性部件 &#xff…