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

golang正则表达式的使用及举例

正则表达式很强大,在一些场合如抓包,爬虫等方面很有用。在 Go语言中,正则表达式通过标准库 regexp 提供支持。使用正则表达式可以进行字符串匹配、替换和分割等操作。

以下是正则表达式的基本使用方法及示例:

1. 导入 regexp 包

在你的 Go 代码中,首先需要导入 regexp 包:

import ("fmt""regexp"
)

2. 编译正则表达式

使用 regexp.Compile 或 regexp.MustCompile 来编译正则表达式。MustCompile 在编译出错时会导致程序崩溃,因此对于已知的正则表达式可直接使用它。

re, err := regexp.Compile("a([a-z]+)e")
if err != nil {fmt.Println("Error compiling regex:", err)
}

或使用:

re := regexp.MustCompile("a([a-z]+)e")
3. 使用正则表达式

编译后的正则表达式可以用于多种功能:

3.1. 匹配字符串

使用 MatchString 函数判断字符串是否符合正则表达式。

matched := re.MatchString("apple")
fmt.Println("Matched:", matched) // 输出: Matched: true
3.2. 查找匹配

使用 FindString 获取匹配的子串。

result := re.FindString("I have an apple here.")
fmt.Println("Found:", result) // 输出: Found: apple
3.3. 查找所有匹配

使用 FindAllString 获取所有匹配的子串。

results := re.FindAllString("I have an apple and an axe here.", -1)
fmt.Println("Found all:", results) // 输出: Found all: [apple axe]
3.4. 替换

使用 ReplaceAllString 替换匹配的子串。

replaced := re.ReplaceAllString("I have an apple and an axe here.", "fruit")
fmt.Println("Replaced:", replaced) // 输出: Replaced: I have an fruit and an fruit here.
3.5. 分割字符串

使用 Split 函数按照正则表达式分割字符串。

splitStrings := re.Split("I have an apple and an axe here.", -1)
fmt.Println("Split:", splitStrings) // 输出: Split: [I have an  and an  here.]

完整示例

下面是一个完整的示例,演示了上述功能:

package mainimport ("fmt""regexp"
)func main() {// 编译正则表达式re := regexp.MustCompile("a([a-z]+)e")// 匹配字符串matched := re.MatchString("apple")fmt.Println("Matched:", matched) // 输出: Matched: true// 找到匹配的字符串result := re.FindString("I have an apple here.")fmt.Println("Found:", result) // 输出: Found: apple// 找到所有匹配的字符串results := re.FindAllString("I have an apple and an axe here.", -1)fmt.Println("Found all:", results) // 输出: Found all: [apple axe]// 替换匹配的子串replaced := re.ReplaceAllString("I have an apple and an axe here.", "fruit")fmt.Println("Replaced:", replaced) // 输出: Replaced: I have an fruit and an fruit here.// 按照正则表达式分割字符串splitStrings := re.Split("I have an apple and an axe here.", -1)fmt.Println("Split:", splitStrings) // 输出: Split: [I have an  and an  here.]
}

要让正则表达式也能匹配到 HelloWorld 这样的字符串,你需要构建一个更灵活的正则表达式,允许字符之间有可选的连字符、空白字符或 · 字符,同时也能匹配连续的字符。

示例代码

package mainimport ("fmt""regexp""strings"
)func fuzzyMatch(pattern, text string) bool {// 将 pattern 拆分为多个部分parts := strings.Split(pattern, "")// 构建正则表达式模式var regexParts []stringfor _, part := range parts {regexParts = append(regexParts, regexp.QuoteMeta(part))}regexPattern := strings.Join(regexParts, `[-\s·]?`)// 构建最终的正则表达式finalPattern := fmt.Sprintf("^.*%s.*$", regexPattern)re := regexp.MustCompile(finalPattern)// 进行匹配return re.MatchString(text)
}func main() {pattern := "HelloWorld"texts := []string{"Hello-World","Hello World","Hello·World","HelloWorld",}for _, text := range texts {if fuzzyMatch(pattern, text) {fmt.Printf("Matched: %s\n", text)} else {fmt.Printf("Not matched: %s\n", text)}}
}

解释

  1. 拆分模式字符串

    • 使用 strings.Split(pattern, "") 将模式字符串拆分为单个字符的切片。
  2. 构建正则表达式模式

    • 使用 regexp.QuoteMeta(part) 对每个字符进行转义,确保它们在正则表达式中被正确处理。
    • 使用 strings.Join(regexParts, [-\s·]?) 将这些字符连接起来,允许它们之间有可选的连字符、空白字符或 · 字符。
  3. 构建最终的正则表达式

    • 使用 fmt.Sprintf("^.*%s.*$", regexPattern) 构建最终的正则表达式,匹配包含模糊模式字符串的任意字符串。
  4. 进行匹配

    • 使用 regexp.MustCompile(finalPattern) 编译正则表达式。
    • 使用 re.MatchString(text) 进行匹配,返回匹配结果。

通过这种方式,你可以实现对包含特定子字符串的字符串进行模糊匹配查找,即使它们之间有空格、标点符号或其他字符,同时也匹配不包含这些字符的字符串。

输出

Matched: Hello-World
Matched: Hello World
Matched: Hello·World
Matched: HelloWorld

相关文章:

golang正则表达式的使用及举例

正则表达式很强大,在一些场合如抓包,爬虫等方面很有用。在 Go语言中,正则表达式通过标准库 regexp 提供支持。使用正则表达式可以进行字符串匹配、替换和分割等操作。 以下是正则表达式的基本使用方法及示例: 1. 导入 regexp 包 …...

Flutter杂学: iOS 上启用自动填充和关联域

下面是详细的配置和代码,以确保在 iOS 上启用自动填充和关联域(Associated Domains)功能。 配置步骤 1. 在 Apple Developer 控制台中启用 Associated Domains 登录 Apple Developer。导航至您的 App ID 设置页面。找到您要配置的 App ID&…...

接口自动化-框架搭建(Python+request+pytest+allure)

使用代码如何开展接口自动化测试。 一 选择自动化测试用例 业务流程优先,单接口靠后,功能稳定优先,变更频繁不选。 二 搭建自动化测试环境 (1)安装python编译器3.7版本以上--自行安装 (2)安…...

[论文阅读]Constrained Decision Transformer for Offline Safe Reinforcement Learning

Constrained Decision Transformer for Offline Safe Reinforcement Learning Proceedings of the 40th International Conference on Machine Learning (ICML), July 23-29, 2023 https://arxiv.org/abs/2302.07351 泛读只需要了解其核心思想即可。 安全强化学习(Safe Rei…...

工具_Nginx

文章目录 location语法介绍跨域配置https配置http重定向到https配置反向代理配置负载均衡配置upstream配置负载均衡算法(1)rr轮询(默认)(2)wrr加权轮询(weight)(3&#x…...

web开发Model1

WEB开发模式–Model 1 Model1是指基于JSPJavaBean的开发模式,JSP负责web的相关部分,包括数据的展示,请求逻辑的控制等,JavaBean负责业务的逻辑部分,包括数据的存取,业务的实现。 这是我写的一个小项目&…...

ImportError: cannot import name ‘Sequential‘ from ‘keras.models‘

报错信息 ImportError: cannot import name Sequential from keras.models错误代码示例 import tensorflow as tf from keras.models import Sequential # 报错行model Sequential()错误分析 这个错误通常发生在 TensorFlow 和 Keras 的版本不兼容时。TensorFlow 2.x 版本…...

python实战(二)——房屋价格回归建模

一、任务背景 本章将使用一个经典的Kaggle数据集——House Prices - Advanced Regression Techniques进行回归建模的讲解。这是一个房价数据集,与我们熟知的波士顿房价数据集类似,但是特征数量要更多,数据也要更为复杂一些。下面,…...

UHF机械高频头的知识和待学习的疑问

电路图如上所示: 实物开盖清晰图如下: 待学习和弄懂的知识: 这是一个四腔的短路线谐振。分别是输入调谐,放大调谐,变频调谐和本振 第一个原理图输入为75欧(应该是面向有同轴线的天线了)如下图…...

深入理解 SQL 中的 WITH AS 语法

在日常数据库操作中,SQL 语句的复杂性往往会影响到查询的可读性和维护性。为了解决这个问题,Oracle 提供了 WITH AS 语法,这一功能可以极大地简化复杂查询,提升代码的清晰度。本文将详细介绍 WITH AS 的基本用法、优势以及一些实际…...

同三维T80005JEHA-4K60 4K60超高清HDMI/AV解码器

1路HDMI1路CVBS1路3.5音频输出,HDMI支持4K60,支持1路4K60解码,1路高清转码 产品简介: T80005JEHA-4K60是一款4K60超高清解码器,支持1路HDMI/CVBS解码输出,HDMI支持4K60,适用于各种音视频解决方…...

深信服秋季新品重磅发布:安全GPT4.0数据安全大模型与分布式存储EDS新版本520,助力数字化更简单、更安全

10月23日,深信服举办2024秋季新品发布会。发布会上,深信服正式推出了最新的创新成果:实现动静态数据分类分级和数据风险自动研判分析的安全GPT4.0、具备卓越可靠性和AI勒索防护能力的分布式存储EDS新版本520。通过这些新品和能力,…...

Flutter图片控件(七)

1、加载图片 import package:flutter/material.dart;void main() {runApp(const MaterialApp(home: MyHomePage(),)); }class MyHomePage extends StatelessWidget {const MyHomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppB…...

JavaEE初阶---文件IO总结

文章目录 1.文件初识2.java针对于文件的操作2.1文件系统的操作---file类2.2文件内容的操作---流对象的分类2.4字符流的操作》文本文件2.4.1异常的说明2.4.2第一种文件内容的读取方式2.4.3第二种读取方式2.4.4close的方法的介绍2.4.5close的使用优化操作2.4.6内容的写入 2.3字节…...

10.28Python_pandas_csv

三、读取CSV文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本); CSV 是一…...

数据处理与可视化:pandas 和 matplotlib 初体验(9/10)

数据处理与可视化:pandas 和 matplotlib 初体验(9/10) 介绍 在如今的数据驱动时代,掌握数据处理与可视化是每个开发者和数据科学家不可或缺的技能。Python 拥有强大的数据处理库 pandas 和数据可视化库 matplotlib,它…...

鸿蒙学习总结

鸿蒙(HarmonyOS),做为国产自主研发设计的第一个操作系统,从开放测试以来一直备受关注。其纯血鸿蒙版(HarmonyOS NEXT)也于进日发布。过去的一段时间里,我站在一个移动开发者的角度对HarmonyOS进…...

如何修改文件创建时间?六个超简单修改方法介绍

怎么修改文件创建时间?在信息安全与隐私保护的领域里,每一个细节都可能成为泄露敏感信息的突破口。文件的创建时间,这个看似微不足道的数据点,实则可能蕴含着重要的时间线索,对于不希望被外界窥探其内容或来源的个人及…...

【MySQL 保姆级教学】内置函数(9)

内置函数 1. 日期函数1.1 日期函数的种类1.2 示例1.3 日期的转换 2. 字符串函数2.1 种类2.2 示例 3. 数学函数3.1 种类3.2 向上取整和向下取整3.3 示例 4. 其他函数4.1 查询当前用户/数据库4.2 ifnull(val1,val2)4.3 md5()函数4.4 password()函数 1. 日期函数 1.1 日期函数的种…...

华为大咖说丨如何通过反馈机制来不断优化大模型应用?

本文分享自时习知 作者:袁泉(华为AI数据工程专家)全文约3015字,阅读约需8分钟 大模型应用正式投入使用后,存在一个较为普遍的情况:在利用“大模型提升业务运营效率”的过程中,业务部门和IT团队…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...