正则表达式详细介绍

目录

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

正则表达式详细介绍

什么是正则表达式?

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是校验字符串是否满足规则或者在文本查找满足要求的内容。我在这里给大家举个简单的例子。

    如果我需要对一组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”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025.2.5

Web [SWPUCTF 2021 新生赛]ez_unserialize: 这个题先了解一下反序列化&#xff1a;反序列化是序列化的逆过程。序列化是将对象或数据结构转换为可以存储或传输的格式&#xff08;如JSON、XML或二进制格式&#xff09;的过程。反序列化则是将这个格式的数据转换回原始的对象或…

新版AndroidStudio 修改 jdk版本

一、问题 之前&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后&#xff0c;比如我升级到了Android Stu…

Web3技术详解

Web3技术代表着互联网技术的最新进展&#xff0c;它致力于打造一个去中心化的互联网生态系统。以下是对Web3技术的详细解析&#xff1a; 一、Web3技术的核心概念 Web3是第三代互联网技术的代名词&#xff0c;代表着去中心化、区块链驱动和用户自有控制的理念。在Web3的世界中…

景联文科技:专业数据采集标注公司 ,助力企业提升算法精度!

随着人工智能技术加速落地&#xff0c;高质量数据已成为驱动AI模型训练与优化的核心资源。据统计&#xff0c;全球AI数据服务市场规模预计2025年突破200亿美元&#xff0c;其中智能家居、智慧交通、医疗健康等数据需求占比超60%。作为国内领先的AI数据服务商&#xff0c;景联文…

3.【BUUCTF】XSS-Lab1

进入题目页面如下 好好好&#xff0c;提示点击图片&#xff0c;点进去页面如下&#xff0c;且url中有传参&#xff0c;有注入点 发现题目给出了源码 查看得到本题的源码 分析一下代码 <!DOCTYPE html><!--STATUS OK--> <!-- 声明文档类型为 HTML5&#xff0c;告…

进程、线程、内存和IO模型的概念详解

进程、线程、内存和IO模型的概念详解 1 进程与线程1.1 进程1.1.1 进程分类1.1.2 进程的状态和转换1.1.3 僵尸进程和孤儿进程的区别1.1.4 进程之间的通信1.1.5 用户态和内核态1.1.6 用户空间和内核空间 1.2 线程1.2.1 线程的状态和转换1.2.2 进程与线程的区别 1.3 多进程和多线程…

浅谈密码相关原理及代码实现

本代码仅供学习、研究、教育或合法用途。开发者明确声明其无意将该代码用于任何违法、犯罪或违反道德规范的行为。任何个人或组织在使用本代码时&#xff0c;需自行确保其行为符合所在国家或地区的法律法规。 开发者对任何因直接或间接使用该代码而导致的法律责任、经济损失或…

Swagger相关内容整合

mvc:pathmatch:matching-strategy: ant_path_matcher 一、引入相关依赖 <!-- 图像化依赖 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version> </de…

【数据结构】循环链表

循环链表 单链表局限性单向循环链表判断链表是否有环思路code 找到链表入口思路代码结构与逻辑 code 单链表局限性 单链表作为一种基本的数据结构&#xff0c;虽然在很多场景下都非常有用&#xff0c;但它也存在一些局限性&#xff1a; 单向访问&#xff1a;由于每个节点仅包含…

简易C语言矩阵运算库

参考网址&#xff1a; 异想家纯C语言矩阵运算库 - Sandeepin - 博客园 这次比opencv快⑥倍&#xff01;&#xff01;&#xff01; 参考上述网址&#xff0c;整理了一下代码&#xff1a; //main.c#include <stdio.h> #include <stdlib.h> #include <string.h…

微服务知识——微服务架构的演进过程

文章目录 初始架构&#xff1a;单机架构第一次演进&#xff1a;Tomcat与数据库分开部署第二次演进&#xff1a;引入本地缓存和分布式缓存第三次演进&#xff1a;引入反向代理实现负载均衡第四次演进&#xff1a;数据库读写分离第五次演进&#xff1a;数据库按业务分库第六次演进…

Hackmyvm crack

简介 难度&#xff1a;简单 靶机地址&#xff1a; 环境 kali&#xff1a;192.168.194.9 靶机&#xff1a;192.168.194.23 扫描 nmap全端口扫描查看tcp服务 三个端口服务21的ftp服务、4200的shellinabox服务&#xff0c;是一个web界面的shell连接工具&#xff0c;12359的一…

P2036 [COCI 2008/2009 #2] PERKET(dfs)

#include<bits/stdc.h> using namespace std;int n; int a[15],b[15]; int ansINT_MAX; // 初始化最小差值为一个很大的数&#xff0c;保证能找到最小值void dfs(int i,int s,int k){if(in){ // 当遍历完所有元素时if(s1&&k0) return;int difabs(s-k);ans mi…

逻辑回归:Sigmoid函数在分类问题中的应用

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 什么是Sigmoid函数&#xff1f; Sigmoid函数&#xff08;Logistic函数&#xff09;是机器学习中最经典的激活函数之一&#xff0c;是一个在生物学中常见的S型函数&#xff0c;也称为S型生长曲线。…

【OpenCV实战】基于 OpenCV 的多尺度与模板匹配目标跟踪设计与实现

文章目录 基于 OpenCV 的模板匹配目标跟踪设计与实现1. 摘要2. 系统概述3. 系统原理3.1 模板匹配的基本原理3.2 多尺度匹配 4. 逻辑流程4.1 系统初始化4.2 主循环4.3 逻辑流程图 5. 关键代码解析5.1 鼠标回调函数5.2 多尺度模板匹配 6. 系统优势与不足6.1 优势6.2 不足 7. 总结…

【系统架构设计师】操作系统 ② ( 存储管理 | 页式存储 | 逻辑地址 与 物理地址 | 页表结构 | 物理内存淘汰机制 )

文章目录 一、页式存储1、CPU 调用数据2、内存存储数据弊端3、分页存储4、逻辑地址 和 物理地址 的结构5、逻辑地址 和 物理地址 的结构 示例6、页式存储 优缺点 二、逻辑地址 与 物理地址1、逻辑地址2、物理地址3、逻辑地址 与 物理地址 区别4、逻辑地址 与 物理地址 的转换 三…

AMD数据中心业务创纪录,Instinct MI355X提前发布

没有人能预料到生成式人工智能&#xff08;GenAI&#xff09;会如此迅速地推动英伟达的扩张&#xff0c;也没有人能预料到英伟达的崛起和英特尔的衰落会如此之快。对于那些相信“第二名可以更努力并取得成功”的人来说&#xff0c;AMD的崛起无疑证明了这一点。然而&#xff0c;…

C++ 中的 `string` 类型:全面解析与高效操作

C 中的 string 类型&#xff1a;全面解析与高效操作 在 C 中&#xff0c;string 类型是对字符数组的高级封装&#xff0c;它提供了大量内置函数&#xff0c;使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同&#xff0c;string 类型不仅自动管理内存&#xff0c;…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工

目录 决策树&#xff1a;代码设计代码&#xff1a; 决策树&#xff1a; 代码设计 代码&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…

DeepSeek 的含金量还在上升

大家好啊&#xff0c;我是董董灿。 最近 DeepSeek 越来越火了。 网上有很多针对 DeepSeek 的推理测评&#xff0c;除此之外&#xff0c;也有很多人从技术的角度来探讨 DeepSeek 带给行业的影响。 比如今天就看到了一篇文章&#xff0c;探讨 DeepSeek 在使用 GPU 进行模型训练…