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

22.1 正则表达式-定义正则表达式、正则语法

1.定义正则表达式

正则表达式意在描述隐藏在数据中的某种模式或规则。

  • 例如:下面的几个字符串看似各不相同:
    • slimshady999
    • roger
    • 1813Wagner
  • 但看似不同的数据却隐藏着相同的特征:
    • 仅由英语字母和数字组成
    • 英语字母有小写也有大写
    • 总字符数介于 5到12之间
  • 这些共同特征可以用正则表达式来描述:
    • ^[a-zA-Z0-9]{5,12}$

正则表达式犹如一门微型语言,通过特定的语法规则,描述字符数据的模式。

利用正则表达式可以很方便地完成以下任务:

  • 数据搜索
    • 在文本集合中搜索符合特定模式规则的子集
  • 数据验证
    • 验证某个文本输入是否符合给定的模式规则
  • 数据变换
    • 将文本集中符合给定模式规则的元素替换掉

Go语言标准库的regexp包对正则表达式提供支持,其中的MatchString函数接受一个正则表达式和一个被搜索字符串,返回值为bool值,用于描述该字符串中是否存在与正则表达式所描述的模式相匹配的部分。

  • match, err := regexp.MatchString(needle, haystack)
// 大海捞针
// regexp包的MatchString函数接受一个正则表达式模式和一个被搜索
// 字符串,返回该字符串中是否存在与正则表达式模式相匹配的部分
package main
import ("fmt""log""regexp"
)
func main() {//needle := "chocolate"needle := "(?i)chocolate"	// (?i)表示忽略大小写haystack := "Chocolate is my favorite!"match, err := regexp.MatchString(needle, haystack)if err != nil {log.Fatal(err)}fmt.Println(match)
}
// 打印输出:
true

 2.正则表达式语法

正则表达式作为一种模式描述语言,有其特定的语法,例如:

语法标记

匹配规则

.

匹配换行符之前的任何字符

*

匹配0到多个任意字符

^

开头

$

结尾

+

匹配1到多次

?

匹配0到1次

[]

匹配字符集内的任意字符

{n}

匹配n次

{n,}

匹配n到多次

{m,n}

匹配m到n次

基于特定匹配语法所构造出的模式描述字符串即正则表达式。

假设在将用户设置的用户名插入数据库之前需要先验证其合法性,规则如下:

  • 用户名的长度至少5个字符但不得超过12个字符
  • 用户名只能由英语字母和阿拉伯数字组成,不能含有其它特殊符号和非英语字符
  • 构成用户名的英语字母可以使用小写也可以使用大写

根据匹配语法得到描述上述规则的正则表达式:^[a-zA-Z0-9]{5,12}$

  • "^"和"$"表示从字符串的第一个字符开始匹配,一直匹配到最后一个字符。
  • "[a-zA-Z0-9]"内的字符集表示与其中任意一个字符匹配,包括大小写英语字母和数字。
  • "{5,12}"内的数值区间表示至少匹配5次,但最多不超过12次。

可以想象不使用正则表达式完成这样的匹配验证并非不可能,但要复杂得多。

 

 

相关文章:

  • k8s学习--Traffic Shifting 流量接入
  • 【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88
  • ubuntu18.04 配置 mid360并测试fast_lio
  • C++ 算法教程
  • 深入理解指针(四)
  • 计算机图形学入门11:图形管线与着色器
  • fs模块(一)
  • Day07-06_13【CT】LeetCode手撕—1. 两数之和
  • Vue主要使用-03
  • mysql之数据聚合
  • 用python纯手写一个日历
  • 数字化校园:打造未来教育新风尚
  • 每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割
  • 分类预测 | Matlab实现基于Transformer多特征分类预测/故障诊断
  • Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
  • __proto__ 和 prototype的关系
  • 4个实用的微服务测试策略
  • DataBase in Android
  • Java 23种设计模式 之单例模式 7种实现方式
  • JAVA SE 6 GC调优笔记
  • mongodb--安装和初步使用教程
  • Spring声明式事务管理之一:五大属性分析
  • SQLServer之创建显式事务
  • 产品三维模型在线预览
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 说说动画卡顿的解决方案
  • 微信小程序实战练习(仿五洲到家微信版)
  • 鱼骨图 - 如何绘制?
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • #HarmonyOS:基础语法
  • #includecmath
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (007)XHTML文档之标题——h1~h6
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (SERIES10)DM逻辑备份还原
  • (八)c52学习之旅-中断实验
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二十三)Flask之高频面试点
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (含答案)C++笔试题你可以答对多少?
  • ***通过什么方式***网吧
  • .net Signalr 使用笔记
  • .Net Web项目创建比较不错的参考文章
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net和php怎么连接,php和apache之间如何连接
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET微信公众号开发-2.0创建自定义菜单
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @取消转义
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [1181]linux两台服务器之间传输文件和文件夹
  • [20170728]oracle保留字.txt