正则表达式详细介绍

目录

    • 正则表达式详细介绍
      • 什么是正则表达式?
      • 元字符
      • 转义字符
      • 字符类
      • 限定字符
      • 字符分枝
      • 字符分组
      • 懒惰匹配和贪婪匹配
      • 零宽断言

正则表达式详细介绍

什么是正则表达式?

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是校验字符串是否满足规则或者在文本查找满足要求的内容。我在这里给大家举个简单的例子。如果我需要对一组qq号(字符串)进行检验,例如,要求qq号必须是6位到20位之内的,不能以0开头,还必须全是数字。按照正常来说,我需要写一个比较复杂的检测方法。像下面这个是不是看起来比较麻烦。

元字符

元字符:即为有特定含义的字符,常见的元字符如下
常用的元字符(只能匹配一个字符)

  • . 匹配除换行符以外的任意字符
  • \w 匹配字母或数字或下划线或汉字
  • \s 匹配任意的空白符
  • \d 匹配数字
  • \b 匹配单词的开始或结束
  • ^ 匹配字符串的开始(在集合字符里[^a]表示非(不匹配)的意思
  • $ 匹配字符串的结束

1. 点号(.)
点号是一个非常常用的元字符,它可以匹配除换行符之外的任意单个字符。例如,正则表达式 a.c 可以匹配 “abc”、“a1c”、“a@c” 等字符串。这是因为点号在这里代表了任意一个非换行的字符,只要满足 “a” 开头,“c” 结尾,中间是任意单个字符的模式,都能被匹配。需要注意的是,不同的编程语言或工具可能对换行符的定义有所不同,有些可能会将回车符(\r)、换行符(\n)或它们的组合都视为换行情况。

2. 星号(*)
星号用于表示匹配前面的元素零次或多次。例如,正则表达式 ab*c 可以匹配多种情况。当 b 出现零次时,它可以匹配 “ac”;当 b 出现一次时,能匹配 “abc”;当 b 出现多次时,像 “abbbc” 也能被成功匹配。这是因为星号允许前面的 b 字符出现任意次数,包括零次。

3. 加号(+)
加号与星号类似,但它要求前面的元素至少出现一次。以正则表达式 ab+c 为例,它可以匹配 “abc”、“abbbc” 等字符串,但不能匹配 “ac”,因为 b 至少要出现一次才能满足该正则表达式的模式。

4. 问号(?)
问号表示匹配前面的元素零次或一次。例如,正则表达式 ab?c 可以匹配 “ac”(此时 b 出现零次)和 “abc”(b 出现一次)。问号常用于表示某个字符或一组字符是可选的情况。

5. 花括号({n}、{n,}、{n,m})
花括号用于精确控制前面元素的匹配次数,有三种常见的用法:

{n}:精确匹配前面的元素 n 次。例如,a{3} 只能匹配 “aaa”,如果文本中是 “aa” 或 “aaaa” 则无法匹配。
{n,}:匹配前面的元素至少 n 次。例如,a{2,} 可以匹配 “aa”、“aaa”、“aaaa” 等,只要 a 的连续出现次数不少于 2 次即可。
{n,m}:匹配前面的元素 n 到 m 次。例如,a{2,4} 可以匹配 “aa”、“aaa”、“aaaa”,但不能匹配 “a” 或 “aaaaa”。
6. 方括号([ ])
方括号用于定义一个字符集合,匹配方括号内的任意一个字符。例如,[abc] 可以匹配 “a”、“b” 或 “c”。方括号内还可以使用连字符表示字符范围,如 [a-z] 可以匹配任意小写字母,[0-9] 可以匹配任意数字。此外,方括号内的字符顺序不影响匹配结果,[abc] 和 [cba] 的匹配效果是一样的。

7. 脱字符(^)
脱字符在正则表达式中有两种常见用法:

在方括号内使用时,表示取反,即匹配不在方括号内的任意字符。例如,[^abc] 可以匹配除 “a”、“b”、“c” 之外的任意字符,像 “d”、“1”、“@” 等都能被匹配。
在正则表达式开头使用时,表示匹配字符串的开头。例如,^abc 表示只有以 “abc” 开头的字符串才能被匹配,对于 “xyzabc” 这样的字符串则无法匹配。
**8. 美元符号( ) ∗ ∗ 美元符号用于表示匹配字符串的结尾。例如, a b c )** 美元符号用于表示匹配字符串的结尾。例如,abc 美元符号用于表示匹配字符串的结尾。例如,abc 表示只有以 “abc” 结尾的字符串才能被匹配,像 “testabc” 可以匹配,但 “abcdef” 则无法匹配。

  • ^:表示匹配字符串的开头,确保邮箱地址从这里开始,避免匹配到包含邮箱地址但不是以其开头的字符串。
  • [a-zA-Z0-9._%±]+:匹配邮箱用户名部分。方括号内定义了允许的字符集合,包括字母(大小写均可)、数字、点号、下划线、百分号、加号和减号。+ 表示这些字符至少出现一次,因为邮箱用户名不能为空。
  • @:匹配邮箱地址中的 “@” 符号,这是邮箱地址的关键分隔符。
  • [a-zA-Z0-9.-]+:匹配域名部分,允许包含字母、数字、点号和减号。同样,+ 表示这些字符至少出现一次。
  • .:匹配域名中的点号,由于点号是元字符,需要使用反斜杠进行转义。
  • [a-zA-Z]{2,}:匹配顶级域名,由至少两个字母组成。常见的顶级域名如 “.com”、“.cn”、“.org” 等都满足这个规则。
  • $:表示匹配字符串的结尾,确保邮箱地址到这里结束,避免匹配到包含邮箱地址但后面还有其他多余字符的情况。

转义字符

当我们需要匹配元字符本身时,就需要使用反斜杠(\)进行转义。因为元字符在正则表达式中有特殊含义,直接使用会被解释为相应的模式匹配规则。例如,要匹配点号(.),就需要使用 .;要匹配反斜杠本身,需要使用 \。在不同的编程语言中,由于字符串本身也可能使用反斜杠进行转义,所以有时需要使用双反斜杠来表示一个真正的反斜杠。例如,在 Python 中,要匹配一个点号,正则表达式字符串需要写成 r’.'(使用原始字符串避免 Python 字符串本身的转义)。

  • \W 匹配任意不是字母,数字,下划线,汉字的字符
  • \S 匹配任意不是空白符的字符
  • \D 匹配任意非数字的字符
  • \B 匹配不是单词开头或结束的位置
  • [^x] 匹配除了x以外的任意字符
  • [^aeiou] 匹配除了aeiou这几个字母以外的任意字符

字符类

  • [abc] 只能是 a, b, 或 c
  • [^abc] 除了 a, b, c 之外的任何字符
  • [a-zA-Z] a 到 z A 到 Z,包括(范围)
  • [a-d[m-p]] a 到 d,或 m 到 p
  • [a-z&&[def]] a-z 和 def 的交集。为:d, e, f
  • [a-z&&[^bc]] a-z 和非 bc 的交集。(等同于 [ad-z])
  • [a-z&&[^m-p]] a 到 z 和除了 m 到 p 的交集。(等同于 [a-lq-z])

限定字符

  • *重复零次或更多次
  • +重复一次或更多次
  • ? 重复零次或一次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次

字符分枝

字符分枝多用于满足不同情况的选择,用“|”将不同的条件分割开来,比如有些固定电话区号有三位,有些有四位,这个时候可以采用字符分枝

例如:\d{3}-\d{8}|\d{4}-\d{8} 可以匹配两种不同长度区号的固定电话

下边的IP地址正则表达式也有用到字符分枝

字符分组

字符分组多用于将多个字符重复,主要通过使用小括号()来进行分组

形如:(\d\w){3} 重复匹配3次(\d\w)

常用于表示IP地址 形如: ^(?😦?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

解析:先把IP地址分为两部分一部分是123.123.123. 另一部分是123,又因Ip最大值为255,所以先使用分组,然后在组里边再进行选择,组里也有三部分,0-199,200-249,250-255,分别和上述的表达是对应,最后还要注意分组之后还要加上一个.,因为是元字符所以要转义故加上. 然后再把这部分整体看做是一个组,重复三次,再加上仅有数字的一组也就是不带.的那一组即可完成IP地址的校验

懒惰匹配和贪婪匹配

贪婪匹配:正则表达式中包含重复的限定符时,通常的行为是匹配尽可能多的字符。

懒惰匹配,有时候需要匹配尽可能少的字符。

    在正则表达式中,默认的匹配模式是贪婪匹配,即尽可能多地匹配字符。例如,正则表达式 a.*b 对于字符串 "aabab" 会匹配整个字符串 "aabab",因为 .* 会尽可能多地匹配字符,直到遇到最后一个 "b"。而非贪婪匹配则是尽可能少地匹配字符,通过在量词后面加上问号 ? 来实现。例如,正则表达式 a.*?b 对于字符串 "aabab" 会匹配 "aab",因为 .*? 会尽可能少地匹配字符,一旦遇到第一个 "b" 就停止匹配。

后向引用用于重复搜索前面某个分组匹配的文本。

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推

示例:\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。

这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)

零宽断言

有时候需要查找某些匹配之前或之后的东西,这个时候就需要用到们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言

零宽断言是一种特殊的正则表达式语法,它用于在不消耗字符的情况下进行位置匹配。也就是说,零宽断言只检查某个位置是否满足特定的条件,而不会将匹配到的字符作为结果的一部分。
常见的零宽断言有以下几种:

1. 正向先行断言((? = …))
正向先行断言用于检查某个位置后面的字符是否满足特定的模式。例如,正则表达式 \w+(?=\d) 可以匹配后面紧跟着一个数字的单词字符序列。对于字符串 “abc123”,它会匹配 “abc”,因为 “abc” 后面紧跟着数字 “1”。

2. 负向先行断言((?!..))
负向先行断言用于检查某个位置后面的字符是否不满足特定的模式。例如,正则表达式 \w+(?!\d) 可以匹配后面不紧跟着数字的单词字符序列。对于字符串 “abc def123”,它会匹配 “abc” 和 “def”,因为 “abc” 后面不是数字,而 “def” 虽然后面跟着数字,但在匹配 “def” 时检查到后面不是数字的条件是满足的。

3. 正向后行断言((?<=…))
正向后行断言用于检查某个位置前面的字符是否满足特定的模式。例如,正则表达式 (?<=$)\d+ 可以匹配前面紧跟着美元符号的数字序列。对于字符串 “$123”,它会匹配 “123”。

4. 负向后行断言((?<!..))
负向后行断言用于检查某个位置前面的字符是否不满足特定的模式。例如,正则表达式 (?<!$)\d+ 可以匹配前面不紧跟着美元符号的数字序列。对于字符串 “123 $456”,它会匹配 “123”。

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

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

相关文章

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…

区块链技术:Facebook 重塑社交媒体信任的新篇章

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着社交平台的快速发展&#xff0c;隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据&#xff0c;这种模…

Redis数据库篇 -- Pipeline

一. 什么是Pipeline 在传统的请求-响应模式中&#xff0c;客户端与服务器之间的通信流程如下&#xff1a; 客户端发送一个命令到服务器。服务器接收命令并执行。服务器将执行结果返回给客户端。客户端接收结果后&#xff0c;发送下一个命令 在这种传统的模式下&#xff0c;…

[权限提升] Linux 提权 维持 — 系统错误配置提权 - 计划任务提权

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Linux 计划任务提权原理 Linux 计划任务提权是由于管理员配置不当&#xff0c;导致以 Root 权限运行的计划任务文件可以被低权限用户修改&#xff0c;从而被攻击者利用&#…

Bootstrap5 表单

Bootstrap5 表单 概述 Bootstrap 是一个流行的前端框架&#xff0c;它提供了丰富的组件和工具来简化网页开发。Bootstrap5 是 Bootstrap 的最新版本&#xff0c;它引入了许多新特性和改进。在本篇文章中&#xff0c;我们将深入探讨 Bootstrap5 中的表单组件&#xff0c;包括其…

LCR 004. 只出现一次的数字 II

文章目录 1.题目2.思路3.代码 1.题目 LCR 004. 只出现一次的数字 II 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。 示例 1&#xff1a; **输入&#xff1a;**nums [2…

UE学习日志#24 C++笔记#10 内存管理1

注&#xff1a;此文章为学习笔记&#xff0c;只记录个人不熟悉或备忘的内容 1 使用动态内存 1.1 如何描述动态内存 区分好栈上自动分配的变量和自由存储区的变量。 1.2 分配和释放 1.使用new和delete delete ptr;ptrnullptr; 2.避免在C中使用malloc()和free()&#xff0c;…

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览&#xff1a; 国家标准|GB/T 43698-2024 相关标准&#xff1a; &a…

记一次golang环境的变化

前两天编译打包了了个文件&#xff0c;把env的 goos 搞坏了 导致运行项目一直报错 先是这样 go: unsupported GOOS/GOARCH pair windows/amd64再是这样 /amd64supported GOOS/GOARCH pair linux咱就说&#xff0c;咱也是知道环境配置的有问题 &#xff08; go env GOOS &…

QT笔记——多语言翻译

文章目录 1、概要2、多语言切换2.1、结果展示2.2、创建项目2.2、绘制UI2.2、生成“.st”文件2.4、生成“.qm”文件2.5、工程demo 1、概要 借助QT自带的翻译功能&#xff0c;实现实际应用用进行 “多语言切换” 2、多语言切换 2.1、结果展示 多语言切换 2.2、创建项目 1、文件…

【鸿蒙HarmonyOS Next实战开发】实现ArkTS/JS和C/C++的交互-Node-API

一、HarmonyOS Node-API简介 在HarmonyOS应用开发中&#xff0c;通常以ArkTS/JS语言为主&#xff0c;但在一些特殊场景下&#xff0c;例如游戏开发、物理模拟等&#xff0c;由于对性能、效率等有较高要求&#xff0c;需要借助现有的C/C库来实现。为了满足这种需求&#xff0c;…

mac环境下,ollama+deepseek+cherry studio+chatbox本地部署

春节期间&#xff0c;deepseek迅速火爆全网&#xff0c;然后回来上班&#xff0c;我就浅浅的学习一下&#xff0c;然后这里总结一下&#xff0c;我学习中&#xff0c;总结的一些知识点吧&#xff0c;分享给大家。具体的深度安装部署&#xff0c;这里不做赘述&#xff0c;因为网…

深度学习01 神经网络

目录 神经网络 ​感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器&#xff08;MLP, Multi-Layer Perceptron&#xff09; 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 ​神经网络的基本…

golang 开启HTTP代理认证

内部网路不能直接访问外网接口&#xff0c;可以通过代理发送HTTP请求。 HTTP代理服务需要进行认证。 package cmdimport ("fmt""io/ioutil""log""net/http""net/url""strings" )// 推送CBC07功能 func main() {l…

SQL带外注入

SQL 带外注入&#xff08;Out-of-Band SQL Injection, OOB SQLi&#xff09; 是 SQL 注入的一种特殊类型&#xff0c;主要用于以下情况&#xff1a; 数据库没有直接返回错误信息&#xff08;比如被防火墙拦截了&#xff09;。无法使用常规注入手法&#xff08;如 UNION、错误信…

电脑右下角小喇叭没反应怎么回事,快速解决方案

当电脑右下角的小喇叭&#xff08;音量图标&#xff09;没有反应时&#xff0c;可以尝试以下快速解决方案&#xff1a; 一、基础检查与操作 检查键盘音量键&#xff1a; 按下键盘上的音量增加或减少键&#xff0c;或尝试Fn音量键&#xff08;部分笔记本需组合键&#xff09;&a…

【服务器知识】如何在linux系统上搭建一个nfs

文章目录 NFS网络系统搭建**1. 准备工作****2. 服务器端配置****(1) 安装 NFS 服务****(2) 创建共享目录****(3) 配置共享规则****(4) 生效配置并启动服务****(5) 防火墙配置** **3. 客户端配置****(1) 安装 NFS 客户端工具****(2) 创建本地挂载点****(3) 挂载 NFS 共享目录***…

P3654 First Step (ファーストステップ)(贪心算法)

#include<bits/stdc.h> using namespace std;int main() {int r,c,k;cin>>r>>c>>k;char a[105][105];int ans0;for(int i0;i<r;i){for(int j0;j<c;j){cin>>a[i][j];}}for(int i0;i<r;i){int cnt0; // 用来记录连续空地的数量for(int j…

ASP.NET Core对JWT的封装

目录 JWT封装 [Authorize]的注意事项 JWT封装 NuGet 库 |Microsoft.AspNetCore.Authentication.JwtBearer 9.0.1https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearerhttps://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBea…

Windows Docker笔记-在容器中运行项目

在文章《Windows Docker笔记-Docker容器操作》中&#xff0c;已经成功创建了容器&#xff0c;也就是建好了工厂&#xff0c;接下来就应该要安装流水线设备&#xff0c;即运行项目达到生产的目的。 在Ubuntu容器中新建项目 这里要新建一个简单的C项目&#xff0c;步骤如下&…