正则表达式全解

news2024/9/21 3:37:32

Regex

regular expressions

先理解什么是正则表达式, 有什么用途

理解: 是表达一类串的抽象模式的串, 来匹配字符串中符合模式的子串

人话: 举例, 例如abc9, abcd9, a&*&%*()9, 这三个字符串有相同的模式(人话来说就是他们有共同点): 都以a开头, 9结尾. 正则表达式就能用来表示这种以a开头, 9结尾的模式(共同点), 来匹配这一类字符串.

a开头, 9结尾的模式用正则表达式表示就是: a.*9

一个正则表达式在线练习网站 https://regex101.com

文章目录

  • Regex
    • 字面模式
      • 1. 字面值字符
      • 2. `[ ]`
        • (1) 直接枚举
        • (2) 范围:
        • (3) 排除:
      • 3. `\d`, `\w`, `\s`, `\n`等
      • 4. `.`
    • 限定符: 表示数量的模式
      • 1. `*`: 0次或多次
      • 2. `+`: 1次或多次
      • 3. `?`: 0次或1次
      • 4. `{n}`: 指定匹配确定的n次,
      • 5. `{n, }`: 指定至少n次(n次或多次),
      • 6. `{n, m}`: 指定最少n次最多m次
      • 7. 贪婪/非贪婪匹配: `*?`, `+?`
    • 定位符
        • 1. 理解:
        • 2. 用法速看
      • `^`: 匹配字符串开始的位置
      • `$`: 匹配字符串结尾的位置
      • `\b`: 匹配字与空格间的那个位置
      • `\B`: 坚决不匹配字与空格间的那个位置
    • 选择: ()
      • 1. 分组
      • 2. 限定前后内容:
        • 1. 简单介绍用途, 不想看直接看下面的表
        • 2.用法速看
    • 或: `|`
    • 练习:
      • 简单模式
      • 困难模式:

字面模式

理解: 用一种模式表达的一个字符

1. 字面值字符

比如字母, 数字, 空格, 或者特殊符号, 匹配的是确定的字符串, 比如正则表达式abc, 会在12312124abcefgabc中匹配连续的abc三个字符, 这没有什么模式可言, 就是固定的搜索

一般和下面的搭配才能表示模式

下面提到的特殊符号, 如果要直接匹配, 要加一个转义

比如要匹配(/123-456)

正则表达式要写\(\/123\-456\)

2. [ ]

用于自定义一个字符集合, 字符集合中任选一个字符都可以用来用来匹配

比如[abc]123,字符集合中有a, b, c, 这三个字符的任意一个都可以用来匹配, 所以可以匹配a123, b123, c123, 但d123不行

接下来就介绍各种各样的字符集合表示方式

(1) 直接枚举

[abcdefg]:字符集合中的任意一个字符都可以用来用来匹配

(2) 范围:

中括号中加-代表范围, [a-g] 就等同于[abcdefg]

(3) 排除:

中括号中加^代表, 除了你定义的集合以外的字符都可以匹配,

比如[^1-3]相当于除了123都可以匹配上

3. \d, \w, \s, \n

就是已经定义过的一些认为是一类字符的字符

最常用的就是\d, \w, \s, \n

  • \d 匹配一个数字字符。等价于 [0-9]。
  • \w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’
  • \s 匹配任何空白字符, 等价于 [ \f\n\r\t\v]。
  • \n 匹配换行符
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。
\W匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]
\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,‘\x41’ 匹配 “A”。‘\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

4. .

匹配任何除了换行的字符

等价于[^\n\r]

限定符: 表示数量的模式

理解: 指定限定符前面的一个普通字符的匹配个数

比如abc+, +是一个限定符, 只限定左边一个模式也就是c, +的意思是限定c出现的次数为1次到任意多次, 也就是abc, abcccccccccc, abccc都会匹配上

1. *: 0次或多次

2. +: 1次或多次

3. ?: 0次或1次

4. {n}: 指定匹配确定的n次,

5. {n, }: 指定至少n次(n次或多次),

6. {n, m}: 指定最少n次最多m次

7. 贪婪/非贪婪匹配: *?, +?

贪婪/非贪婪理解:一个带*+的regex可能匹配到多个不同长短的字符串, 贪婪和非贪婪分别就是指定 取这些不同长短字符串中 最长的还是最短的, +, *都是贪婪的(会尽可能多的匹配),后面加上?就能指定匹配最短的

看个例子就能理解

string: <h1>hello</h1>

regex1: <.*> :

<h1>hello</h1><h1>都是符合匹配模式的, 但*会匹配尽可能多的字符, 所以最后的匹配结果是 <h1>hello</h1>

regex2: <.*?>:

<h1>hello</h1><h1>都是符合匹配模式的, 相反*?会匹配尽可能少的字符, 所以最后的匹配结果是 <h1>

定位符

1. 理解:

定位符也是一个模式, 但是不匹配具体的字符匹配的是一个位置, 比如^就是匹配待匹配字符串的最开头的那个位置, 整个字符串的最开头就只有一个,

2. 用法速看

^: 匹配字符串开始的位置

$: 匹配字符串结尾的位置

\b: 匹配字与空格间的那个位置

\B: 坚决不匹配字与空格间的那个位置

\B举例:

string: aptitude chapter

regex: \Bapt就不会匹配到aptitude的apt, 因为apt是字与空格间的那个位置

选择: ()

1. 分组

理解: 用()括起来的模式串会匹配多个弄成一个可以访问的数组

2. 限定前后内容:

1. 简单介绍用途, 不想看直接看下面的表

想要在字符串 123@qq.com, 123@foxmail.com, 13312312312中匹配qq邮箱的qq号

不正确的正则1号: \d+, 字符串中所有的数字都被匹配到了, 包括最后的电话号码

不正确的正则2号: \d+@qq.com, 这下只会匹配到123@qq.com, 但是我们要求只要前面的qq号, 不要多余的@qq.com

正确的正则3号: \d+(?=@qq.com), 要求后面有@qq.com, 但不把@qq.com匹配进去

2.用法速看
匹配括号前面匹配括号后面
满足括号里模式的前提下匹配(但是不匹配括号里的内容)?=?<=
满足括号里模式时不匹配?!?<!

比如

(?<=\d+)abc(?!\d)

要求abc前面必须有至少一个数字, 后面不能有数字

或: |

比较简单, 直接举例

待匹配字符串abcdefg

正则表达式:abc | efg

就是匹配abc或者efg, 二者其一匹配上都行

就会得到 abcdefg

练习:

简单模式

匹配所有qq邮箱的用户名

1123-12312@qq.com hello-world123@hust.edu.cn
123-1h@ @qq.com hello123@qq.com

答案

[\-\w]+(?=@qq.com)

困难模式:

匹配C, C++中的单行注释和多行注释

#include "lib/mylib.hpp"
#include <string>

int main() {
  std::string s = "no ! // this is not a comment";
  int a = 5; // this is a inline comment
  // another inline comment // don't split it
  ///another comment //
  //
  // this ";" punctuation is called semicolon
  /* a multiline comment is surrounded by
  a pair of /* 
  and */
  std::string warning = "don't combine these two multiline comment"
  /* a multiline comment is surrounded by
  a pair of /* 
  and */
}

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

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

相关文章

windows打开可选功能窗口的方式(呜呜设置里面找不到可选功能只能这样找了)

打开方式 winR打开运行窗口&#xff0c;输入fodhelper&#xff0c;按下回车键 即可快速打开可选功能窗口

手动部署并测试内网穿透

文章目录 手动部署并测试内网穿透1、原理2、下载 frp 文件3、配置对应的配置文件4、启动 frp 服务5、效果 手动部署并测试内网穿透 1、原理 原理就是让你需要访问的内网可以被其他内网访问到。 其实就是让内网经过一个公网服务器的转发&#xff0c;使得能够被访问。 这里我们需…

算法课习题汇总(2)

整数划分问题 将正整数n表示成一系列正整数之和&#xff0c;nn1n2…nk(n1>n2>…>nk,k>1)。正整数n的这种表示称为正整数n的划分。 思路&#xff1a; n表示待划分数&#xff0c;m表示最大减数。 #include<iostream> using namespace std;int q(int n, int…

MySQL:库表的基本操作

库操作 查看 查看存在哪些数据库&#xff1a; show databases;查看自己当前处于哪一个数据库&#xff1a; select database(); 由于我不处于任何一个数据库中&#xff0c;此处值为NULL 查看当前有哪些用户连接到了MySQL&#xff1a; show processlist; 创建 创建一个数据库 语…

【JAVA入门】Day48 - 线程池

【JAVA入门】Day48 - 线程池 文章目录 【JAVA入门】Day48 - 线程池一、线程池的主要核心原理二、自定义线程池三、线程池的大小 我们之前写的代码都是&#xff0c;用到线程的时候再创建&#xff0c;用完之后线程也就消失了&#xff0c;实际上这是不对的&#xff0c;它会浪费计算…

【源码+文档+调试讲解】健身房管理平台小程序

摘 要 随着健康意识的增强和移动互联网技术的普及&#xff0c;健身房管理平台小程序应运而生&#xff0c;为健身爱好者提供便捷的健身服务和管理。本设计针对传统健身房会员管理混乱、课程预约不便利、用户互动缺乏等问题&#xff0c;开发了一款集教练、预约教练、会员、健身…

正也科技-辖区与指标管理系统 强化决策支持

正也科技的“辖区与指标管理系统”设计理念先进&#xff0c;旨在通过科学合理的组织架构和精细化的指标管理&#xff0c;帮助企业实现更高效的市场布局、人员配置及业绩监控。以下是对该系统核心功能的进一步阐述及其对企业运营带来的优势&#xff1a; 正也科技辖区管理 1. 组…

基于SpringBoot+Vue+MySQL的社区医院管理系统

系统展示 系统背景 在当前医疗体系日益完善的背景下&#xff0c;社区医院作为基层医疗服务的重要一环&#xff0c;其管理效率和服务质量直接关系到居民的健康福祉。为了提升社区医院的管理水平&#xff0c;优化患者就医体验&#xff0c;我们设计了一套基于SpringBoot、Vue.js与…

深兰科技荣获“2024年度人工智能最具商业合作价值企业”奖

9月19日&#xff0c;以“释放AI应用价值&#xff0c;发展新质生产力”为主题的“AIAC2024人工智能应用大会”在北京隆重举行。大会揭晓了“AI卓智奖”年度人工智能创新评选的获奖榜单&#xff0c;深兰科技荣获“2024年度人工智能最具商业合作价值企业”称号&#xff0c;同时&am…

【高分系列卫星简介——高分一号(GF-1)】

高分一号卫星&#xff08;GF-1&#xff09; 高分一号&#xff08;GF-1&#xff09;是中国高分辨率对地观测系统&#xff08;简称“高分专项”&#xff09;的第一颗卫星&#xff0c;具有里程碑式的意义。以下是对高分一号卫星的详细介绍&#xff1a; 一、基本信息 发射时间&…

标签云效果

产品要求&#xff0c;词云要实现动态滚动。查资料&#xff0c;改写效果。 echarts词云效果 传统的echarts-wordCloud不能满足需求。 标签云 换了标签云&#xff0c;以下是代码 <template><div class"mx-auto" :style"{ width: width px }"&g…

平凉锅盔,真的绝绝子

平凉&#xff0c;这座古老的城市&#xff0c;孕育出了一种令人赞叹的美食 —— 平凉锅盔。平凉锅盔&#xff0c;那是一种能瞬间勾起人们食欲的存在。远远望去&#xff0c;它如同一座金色的小山&#xff0c;散发着诱人的光泽。其外形圆润饱满&#xff0c;厚实的面饼给人一种踏实…

时代变了,MySQL 早已不是最流行的数据库了

以下文章来源于古时的风筝 &#xff0c;作者风筝 在StackOverflow 上看到2024年技术趋势&#xff0c;关于数据库的部分&#xff0c;PostgreSQL 是开发人员使用最多的数据库&#xff0c;超过 MySQL 了。虽然在国内好像不是这样。 PostgreSQL 在 2018 年的开发者调查中首次亮相…

极越联手百度这你受得了吗!SU7还能稳坐“7字辈”头把交椅?

文/王俣祺 导语&#xff1a;自从今年上半年小米SU7标榜为“年轻人的第一台纯电轿车”&#xff0c;各家车企全都坐不住了。尤其是与小米“颇有渊源”的吉利&#xff0c;从极氪再到领克&#xff0c;目标已经可以说是路人皆知了。现在极越07也来了&#xff0c;可以看出吉利也是下了…

Python游戏开发中的16个关键概念

大家好&#xff01;今天我们要聊的是Python游戏开发中的一些关键概念。无论是初学者还是有一定经验的开发者&#xff0c;了解这些概念都将有助于你更好地掌握游戏开发的基础。接下来&#xff0c;我们将从简单的概念入手&#xff0c;逐步过渡到更复杂的技巧。 文末有惊喜福利 1.…

如何选择适合客户运营团队的帮助中心搭建工具?8款工具盘点

在竞争激烈的商业环境中&#xff0c;客户运营团队需要高效、便捷的工具来搭建帮助中心&#xff0c;以提升客户服务质量和用户体验。选择合适的帮助中心搭建工具&#xff0c;不仅能提高团队工作效率&#xff0c;还能增强客户满意度和忠诚度。本文将为您盘点八款适合客户运营团队…

FC优化配置

1.集群扩容CNA时打开bmc 2.给rhel7虚拟机安装tools-需要重启虚拟机 3.FC上创建集群 资源池右击创建集群&#xff08;物理机大于10台&#xff0c;分业务类型创建集群&#xff09; &#xff08;解决集群内主机挂了&#xff0c;动态调整&#xff09; &#xff08;解决集群内个别…

vulnhub(11):derpnstink(hydra爆破用户名和密码、验证的文件上传)

端口 nmap主机发现 nmap -sn 192.168.159.120/24 ​ Nmap scan report for 192.168.159.120 Host is up (0.00020s latency). ​ 120是新出现的机器&#xff0c;他就是靶机 nmap端口扫描 nmap -Pn 192.168.159.120 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nma…

C#为任意组件开发登录功能的记录

非常简单&#xff0c;直接给出代码&#xff1a; 数据库操作类 这个无需多言就是简单的包含了数据操作的内容&#xff0c;允许你在这一个类中写完关于本地数据库或者云数据库操作的逻辑&#xff0c;与登录逻辑分开哦。 注意&#xff0c;如果你的软件要给别人运行使用&#xf…

电脑连接手机热点只能登陆qq和微信 浏览器无法正常上网的原因

电脑连接手机热点只能登陆qq和微信 浏览器无法正常上网的原因 浏览器有报错dns错误 但是火绒无法正常修复 DNS配置异常 chrome报错DNS_PROBE_FINISHED_BAD_CONFIG 错误原因在ipv4dns服务器他的地址,如果是自动获取 是192.168.208.143 和ipv4地址冲突,导致不正常,我查看本机…