0基础快速掌握正则表达式

news2025/1/20 3:50:51

背景

在日常开发中,我们经常会遇到使用正则表达式的场景,比如一些常见的表单校验,会让你匹配用户输入的手机号或者身份信息是否规范,这就可以用正则表达式去匹配。相信大多数人在碰到这种场景的时候都是直接去网上找,然后一顿cv操作就过去了,下次再遇到相同的问题时,又是重复一遍之前的操作。

正则作为一个用途比较广泛的技术,理应被我们所掌握,而不是每次都只有在需要用到的时候临时去网上查找,如果出了问题你也找不到问题出在哪。我们今天的课程就会教大家如何去使用正则表达式,不光能看懂别人写的,也可以自己去写一些常见的正则表达式。

什么是正则表达式?

- 正则表达式是用于匹配字符串中字符组合的模式。许多语言都支持正则表达式,在 JavaScript 中,正则表达式也是对象。

- 就是用来匹配字符串的规则

  1. 判断一个字符串中是否包含有某个字符或者某个字符串

     > 找出字符串'000000O0000000'中是否有大写字母O

  2. 判断用户输入的手机号是否合法

     <img src="./img02.png" alt="img02" style="zoom:50%;" />

正则表达式的语法

语法

定义一个正则表达式

```js
const 变量名 = /表达式/
```

比如:

```js
const reg = /前端/
```

- test() - 用来查看正则表达式与指定的字符串是否匹配

```js
const reg = /前端/
reg.test('学前端,来黑马') // true
```

- exec() - 查找符合规则的字符串

```js
const reg = /前端/
const str = '学前端,来黑马,前端工资高,就业前景好'
console.log(reg.exec(str)) // ['前端', index: 1, input: '学前端,来黑马,前端工资高,就业前景好', groups: undefined]
```

- replace() - 用来替换字符串中符合规则的字符

```js
const reg = /java/
const str = '学java,来黑马'
str.replace(reg, '前端') // '学前端,来黑马'
```

- match() - 可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

```js
const reg = /前端/g
const str = '学前端,来黑马,前端工资高,就业前景好'
str.match(reg) // ['前端', '前端']
```

修饰符

修饰符约束正则执行的某些细节行为,如是否区分大小写、是否全局匹配

// i 
console.log(/a/.test('A')) // false
console.log(/a/i.test('A')) // true

 

// g
const str = 'hello world'
str.replace(/o/, '_') // hell_ world
str.replace(/o/g, '_') // hell_ w_rld

元字符

普通字符

大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。

元字符

是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能

> 比如:匹配26个英文字母,用普通字符表示 abcde...xyz,但是用元字符表示的话,只需要 [a-z]

1. 边界符

   (1)单词边界

   找出某句话中的某个单词,例如:`The cat scattered his food all over the room.`

   想找到`cat`这个单词,但是如果只是使用`/cat/`这个正则,就会同时匹配到`cat`和`scattered`这两处文本,这时候就可以用到单词边界`\b`,它其实匹配的是能构成单词的字符(\w)和不能构成单词的字符(\W)中间的那个位置。

   ```js
   // 这个正则就只会匹配到单词cat而不会匹配到scattered了
   const reg = /\bcat\b/
   ```

3. 字符类

   (1)[ ]  匹配字符集合

  // 后面的字符串只要包含 abc 中任意一个字符
      const reg1 = /[abc]/
      console.log(reg1.test('andy')) // true
      console.log(reg1.test('baby')) // true
      console.log(reg1.test('cry')) // true
      console.log(reg1.test('dad'))  // false
      
      // 使用连字符 - 表示一个范围
      const reg2 = /[a-z]/ // 匹配26个英文小写字母中的任意一个
      const reg3 = /[a-zA-Z]/ // 匹配26个英文字母中的任意一个,大小写都可以
      const reg4 = /[0-9]/ // 匹配0-9中的数字
      
      // []里面加上^表示取反,注意要写到中括号里
      const reg5 = /[^a-z]/ // 表示匹配除了26个小写字母以外的字符

   (2). 匹配除换行符之外的任意单个字符

   

  const reg = /./ // 匹配除换行符之外的任何单个字符
   reg.test('aaa') // true
   reg.test('123') // true
   reg.test('\n') // false

   (3)预定义:指的是某些常见模式的简写方式。

 

分组和分支结构

分组

我们知道`/a+/`匹配连续出现的“a”,而要匹配连续出现的“ab”时,需要使用`/(ab)+`,其中括号是提供分组功能,使量词`+`作用于“ab”这个整体

const reg = /(ab)+/g;
const str = "abba abbb babbba";
str.replace(reg, 'cd') // 'cdba cdbb bcdbba'

分组捕获:例如将YYYY-MM-DD格式的日期替换成MM/DD/YYYY

YYYY-MM-DD的匹配模式为 `/\d{4}-\d{2}-\d{2}/`,是将整个日期作为一个组(group)匹配起来。 我们把这样的叫`Group0`。

这个时候,如果我们上括号`/(\d{4})-(\d{2})-(\d{2})/`,那么分组就是下面的情况:

``yaml
YYYY-MM-DD   Group0
YYYY         Group1
MM           Group2
DD           Group3

想要获取每个分组匹配的内容该怎么获取呢?可以通过`$`符号获取,比如`$1` 代表`YYYY`, `$2`代表`MM`,所以完整的代码应该如下:

const reg = /(\d{4})-(\d{2})-(\d{2})/
const date = "2023-01-05"
console.log(reg.test(date)) // true
console.log(date.replace(reg, '$2/$3/$1')) // 01/05/2023

分支结构

分支结构类似逻辑操作中的或操作,表示匹配规则1或者规则2

const reg = /(java)|(前端)/;
const str1 = "学前端,来黑马";
const str2 = "学java,也可以来黑马"
reg.test(str1) // true
reg.test(str2) // true

案例

1. 密码匹配(6-16位字母、数字或者下划线)

```js
const reg = /^[a-zA-Z0-9_]{6,16}$/
```

2. 匹配16进制颜色值(比如:#f0f0f0, #fff)

```js
const reg = /^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/
```

3. 匹配24小时制的时间(比如:23:59,08:29)

```js
const reg = /^([01][0-9]|[2][0-3]):[0-5][0-9]$/;
```

4. 手机号码脱敏

// 15812345678 => 158****5678
const reg = /(^1[3-9]\d)\d{4}(\d{4})/
const mobile = "15812345678"
console.log(reg.test(mobile)) // true
console.log(mobile.replace(reg, '$1****$2')) // 158****5678

常用的正则的工具

1. vscode插件:any-rule

   功能:支持一键生成常见的正则表达式

2. https://regexper.com/

   功能:可视化自己写的正则表达式
 

推荐教程:两小时快速掌握正则表达式

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

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

相关文章

在 2023 ETH Denver 与 Cartesi 一起建设

我们非常高兴的加入了 2023年ETHDenver&#xff0c;参加了BUIDLathon 赛道和现场研讨会等活动。作为规模最大、持续时间最长的ETH 活动之一&#xff0c;我们将向热衷于为全球区块链生态系统做出贡献的新开发者社区分享 Cartesi 技术。你想在2023年#BUIDL 做一些有趣有意义的事情…

基于springboot的景区旅游信息管理系统(源代码+数据库)

基于springboot的景区旅游信息管理系统(源代码数据库) 一、系统介绍 本项目分为管理员与普通用户两种角色 用户登录 前台功能&#xff1a;旅游路线、旅游景点、旅游酒店、旅游车票、旅游保险、旅游策略管理员登录 后台功能&#xff1a;用户管理、旅游路线管理、旅游景点管理…

Codeforces Round #843 (Div. 2)(A~C,E)

A1/A2. Gardener and the Capybaras (easy version)三个字符串&#xff0c;按照顺序连在一起&#xff0c;三个字符串满足第二个字符串大于等于第一个和第三个&#xff0c;或者第二个字符串小于等于第一个和第三个&#xff0c;输出满足情况的三个字符串。思路&#xff1a;对于长…

ubuntu18.04系统下挂载新的机械硬盘

ubuntu18.04系统下挂载新的机械硬盘1.显示硬盘以及所属分区情况sudo fdisk -lDisk /dev/sda doesnt contain a valid partition table硬盘分区 对机械硬盘进行操作 sudo fdisk /dev/sda下图表示的是具体流程截图&#xff1a; The partition table has been altered!硬盘格式…

AWS RDS开启审计日志

问题 需要对AWS的RDS开启相关日志。先检查RDS是否开启日志&#xff0c;如下图&#xff1a; 选中一个数据库实例&#xff0c;查看到只开启了数据库的错误日志。但是&#xff0c;我们需要开启其他类型的审计日志。下面开始怎么样开启其他类型日志&#xff0c;来启用高级审计模…

corrosion 靶机(ffuf模糊测试,命令执行)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;c2j6 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 1.探测目标靶机开放端口和服务情况 2.用gobuster扫描目录&#xff0c;并访问 gobuster dir -…

手把手编译FFmpeg

支持centos8.6、ubuntu20.04 export 建议开始之前&#xff0c;弄一台干净的机子&#xff0c;或者系统恢复到出厂设置&#xff0c;否则容易出问题 然后设置动态库默认加载目录&#xff08;注意/usr/local/lib不是系统默认的路径&#xff0c;/lib和/usr/lib才是&#xff09; …

jsp库存管理管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 库存管理管理系统 是一套完善的系统源码&#xff0c;对理解JSP java serlvet MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S 模式开发。 通过本系统建设&#xff0c…

ArcGIS基础实验操作100例--实验97计算河道方向坡度

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验97 计算河道方向坡度 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

内存管理-模板初阶理解-string类的模拟实现

文章目录1. 内存管理operator new和operator delete面试题&#xff1a;malloc、free和new、delete的区别2. 内存泄漏1. 内存泄漏&#xff1a;2. 内存泄漏危害&#xff1a;3.堆内存泄漏4.系统资源泄漏3. 模板初阶函数模板类模板&#xff1a;模板运行时不检查数据类型&#xff0c…

黑马编程资源最新最全全清单:速来收藏~

今年是黑马坚持免费分享视频教程的第16年&#xff0c;每年到了这个时候&#xff0c;「成绩单」也不会缺席&#xff0c;不仅是对过往的回顾&#xff0c;更是对那些选择跟着黑马持续学习的小伙伴们的一种激励。 黑马视频教程2022年速报 截至年底&#xff0c;黑马程序员 B 站累计…

ArcGIS基础实验操作100例--实验96创建地形剖面图

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验96 创建地形剖面图 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

头戴式耳机跑步方便吗、公认最好的跑步耳机排行榜

平时&#xff0c;我们总能看到许多运动健身的人群&#xff0c;在锻炼时都佩戴着耳机。但运动耳机的选择&#xff0c;同样是大有学问的。如果佩戴传统的真无线蓝牙耳机&#xff0c;有可能出现佩戴不稳、耳道肿胀等问题&#xff0c;影响运动体验。所以今天我们特意给大家带来几款…

时间段查询将00:00:00更换成23:59:59

目录 一.问题描述 二.解决问题 2.1.思路一(时间戳赋值) 2.2思路二(LocalDateTime 方法赋值) 三.总结 一.问题描述 在我们作web项目的时候总会有时间段的查询条件 例如: 问题: 前端传到后台的时间: reportStartTime: 2023-01-01 00:00:00 reportEndTime: 2023-01-13 00…

Vue3和Vue2的区别

vue经历从2.0到3.0更新之后&#xff0c;简⽽⾔之就是变得更轻&#xff0c;更快&#xff0c;使⽤起来更加⽅便&#xff0c;每⼀次的版本迭代都是对上⼀个版本的升级优化&#xff0c;不管 是对于我们开发者还是对于⽤户体验都是不断地在越来越⽅便&#xff0c; 选项式Api与组合式…

【计数服务】计数服务落地

一、计数服务 计数服务是针对某个动作在不同维度行为次数的统计或者累加&#xff0c;计数服务需要满足计数的准确性&#xff0c;并且在满足准确性的同时&#xff0c;要注意其性能。 二、计数服务的实现 计数服务分为 非精准计数和精准计数 非精准计数&#xff1a;点赞量、浏…

【Blender UV映射03】如何处理复杂的结构 如何整理UV

写在前面 前面的学习记录&#xff1a; 【Blende UV映射01】创建UV 使用UV贴图处理纹理 【Blender UV映射02】智能UV映射 创建和应用法线纹理 依旧是跟着Blender 2.8 UV Mapping教程&#xff0c;本文是教程的P13-P19的过程记录。 1 善用L分析模型结构 拿到一个相对复杂的模…

压轴级教程!Java人必学的微服务项目上线!

给你说个冷知识下周末就要过年了……年关将至有人欢喜有人愁欢喜的是在外奔波一年终于可以和家人相聚愁的则是回家无非是&#xff1a;1.圆了亲戚的媒婆梦2.让亲戚过过嘴瘾3.成为晚辈的反面教材面对七大姑八大姨的灵魂拷问——有对象了吗&#xff1f;——现在做啥工作&#xff1…

2022年美赛B题O奖获奖分享

1.美赛获奖分享&#xff1a; ** 可以去我的网站逛逛点击传输 ** 首先是选题&#xff0c;今年MCM选择A,B题目的队伍相对较少&#xff0c;超60%的队伍选择C题&#xff0c;对题目的选择需要慎重&#xff0c;较难的题目参赛的队伍会少一些&#xff0c;获得O奖的概率理论上较高…

day14|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输…