快速掌握 ==== js 正则表达式

news2024/9/23 13:30:38

git 地址
https://gitee.com/childe-jia/reg-test.git

背景

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

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

什么是正则表达式?

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

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

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

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

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

在这里插入图片描述

正则表达式的语法

语法

定义一个正则表达式

const 变量名 = /表达式/;

比如:

const reg = /前端/;
  • test() - 用来查看正则表达式与指定的字符串是否匹配
const reg = /前端/;
reg.test("学前端,来黑马"); // true
  • exec() - 查找符合规则的字符串
const reg = /前端/;
const str = "学前端,来黑马,前端工资高,就业前景好";
console.log(reg.exec(str)); // ['前端', index: 1, input: '学前端,来黑马,前端工资高,就业前景好', groups: undefined]
  • replace() - 用来替换字符串中符合规则的字符
const reg = /java/;
const str = "学java,来黑马";
str.replace(reg, "前端"); // '学前端,来黑马'
  • match() - 可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
const reg = /前端/g;
const str = "学前端,来黑马,前端工资高,就业前景好";
str.match(reg); // ['前端', '前端']
修饰符

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

修饰符说明
i单词 ignore 的缩写,正则匹配时字母不区分大小写
g单词 global 的缩写,匹配所有满足正则表达式的结果
// 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/这个正则,就会同时匹配到catscattered这两处文本,这时候就可以用到单词边界\b,它其实匹配的是能构成单词的字符(\w)和不能构成单词的字符(\W)中间的那个位置。

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

    (2)字符串边界

    边界符说明
    ^表示匹配行首的文本
    $表示匹配行尾的文本

    注意:如果^ 和 $ 在一起,表示必须是精确匹配

  2. 量词:表示某个模式出现的次数

    量词说明
    *重复 0 次或更多次
    +重复 1 次或更多次
    ?重复 0 次或 1 次
    {n}重复 n 次
    {n,}重复 n 次或更多次
    {n,m}重复 n 到 m 次

    注意:逗号两侧不能出现空格

  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")); // true
    
    // 使用连字符 - 表示一个范围
    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)预定义:指的是某些常见模式的简写方式。

    预定类说明
    \d匹配 0-9 之间的任意数字,相当于[0-9]
    \D匹配 0-9 以外的任意字符,相当于[ ^0-9]
    \w匹配任意的字母,数字和下划线,相当于[a-zA-Z0-9_]
    \W匹配除字母,数字和下划线以外的字符,相当于[ ^a-zA-Z0-9_]
    \s匹配空格(包含换行、空格、制表符等),相当于[\t\r\n\v\f]
    \S匹配非空格的字符,相当于[ ^\t\r\n\v\f]
分组和分支结构
分组

我们知道/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})/,那么分组就是下面的情况:

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 位字母、数字或者下划线)
const reg = /^[a-zA-Z0-9_]{6,16}$/;
  1. 匹配 16 进制颜色值(比如:#f0f0f0, #fff)
const reg = /^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/;
  1. 匹配 24 小时制的时间(比如:23:59,08:29)
const reg = /^([01][0-9]|[2][0-3]):[0-5][0-9]$/;
  1. 手机号码脱敏
// 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/1910733.html

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

相关文章

base SAS programming学习笔记10(combine data)

1.一对一合并 基本格式如下: data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的数据集,可以添加多个set 语句来实现上述的一对一合并) run; 输出数据集结果如下: a.会包含所有输入数据的变量名&#x…

Linux 系统 CPU 100% 异常问题,能否用一个 Shell 脚本完美解决?

昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并发或者CPU密集型的应用&#x…

【linux服务器篇】-Redis-RDM远程连接redis

redis desktop manager 使用远程连接工具RDM连接redis 市面上比较常见的其中一款工具redis desktop manager 简单的说: Redis Desktop Manager 简单的来讲就是Redis可视化工具,可以让我们看到Redis中存储的内容。 redis desktop manager是一款功能强…

《梦醒蝶飞:释放Excel函数与公式的力量》10.2 COMPLEX函数

第二节 10.2 COMPLEX函数 10.2.1函数简介 COMPLEX函数是Excel中的一个工程函数,用于将实部和虚部组合成一个复数。复数广泛应用于工程、电气、物理等领域,COMPLEX函数提供了方便的复数表示和计算方法。 10.2.2语法: COMPLEX(real_num, i_…

AcWing 1073:树的中心 ← 树形DP

【题目来源】https://www.acwing.com/problem/content/1075/【题目描述】 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。 请你在树中找到一个点,使得该点到树中其他结点的最远距离最近…

nvm 管理多版本 node

1、下载 先不安装node 下载 nvm 1.1.10-setup.zip 解压:nvm:https://nvm.uihtm.com/ 新建nodejs/node、nodejs/nvm文件夹用于存放node版本和nvm安装路径 安装nvm:上述链接有安装教程 查看是否安装成功:重新打开cmd 输入 nvm nv…

西瓜杯CTF(1)

#下班之前写了两个题&#xff0c;后面继续发 Codeinject <?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);"); payload 闭合后面的括号来拼接 POST / HTTP/1.1 Host: 1dc86f1a-cccc-4298-955d-e9179f026d54…

044基于SSM+Jsp的个性化影片推荐系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

鼠标点击触发-----以控制开灯、宝箱触发为例

开灯 当点击时触发开灯效果 &#xff08;不用设置触发器&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class OpenLight : MonoBehaviour {public Transform light;bool isOpen;private void OnMouseDown(){if (!isOpe…

k8s 部署RuoYi-Vue-Plus之server部署

1.先使用项目编排构建镜像, 修改prod使用的mysql, redis地址 获取运行的服务 kubectl get svc -n ruoyi对应连接修改 然后运行打包package命令, 生成jar包, 再打包为docker容器, 上传到所有节点上, 也可以上传到个人私有仓库 2.部署server-deploy.yaml 镜像名自行修改, apiV…

【免费的车间数据监控大屏】车间管理的新利器,让生产效率一目了然

面对生产车间里各种繁杂的数据&#xff0c;你不会还在用Excel敲击一个个无聊的数据吧&#xff1f;怎么不试试生动形象的车间数据看板呢&#xff1f; 在繁忙的车间里&#xff0c;每一寸空间都跳动着生产的脉搏&#xff0c;而车间数据监控看板&#xff0c;就像是这个舞台上的“智…

C++deque容器

文章目录 deque容器概念deque操作deque对象的带参数构造deque头部和末尾的添加移除操作deque的数据存取deque与迭代器deque赋值deque插入deque删除 deque容器概念 deque是双端数组&#xff0c;而vector是单端的。 deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元…

Mysql数据库两表连接进行各种操作

一&#xff0c;创建两个表emp和dept&#xff0c;并给它们插入数据 1.创建表emp create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; 2.创建表dept create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) cha…

电脑清理c盘内存空间怎么清理免费 怎么清理c盘的垃圾文件又不删除有用文件

在计算机使用过程中&#xff0c;随着时间的推移&#xff0c;C盘空间可能会被各种临时文件、缓存和无用的注册表项占用。这不仅会导致C盘空间不足&#xff0c;还可能影响计算机的性能。那么怎么样清理C盘内存空间&#xff0c;怎么样清理C盘的垃圾避开系统文件呢&#xff1f; 一…

手机自带录屏在哪?6个软件教你快速进行手机录屏

手机自带录屏在哪&#xff1f;6个软件教你快速进行手机录屏 手机自带的录屏功能可以让你轻松录制屏幕上的内容&#xff0c;记录游戏过程、制作教程或捕捉其他重要时刻。不同品牌的手机可能在不同位置提供录屏功能。以下是一些常见的手机品牌及其录屏功能位置&#xff0c;以及一…

【python 学习】快速了解python内置类型

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、内置类型的介绍1.1 类型体系1.2 空类型和None1.3 布尔值 二、内置类型的运算2.1 布尔运算2.2 比较运算符比较…

Avalonia开发实践(二)——开发带边框的Grid

一、开发背景 在实际开发工作中&#xff0c;常常会用到Grid进行布局。为了美观考虑&#xff0c;会给每个格子加上边框&#xff0c;如下图&#xff1a; 原生的Grid虽然有ShowGridLines属性可以控制显示格子之间的线&#xff0c;但线的样式不能定义&#xff0c;可以说此功能非常…

人声提取软件有哪些?4种人声提取软件轻松提取人声

在数字音乐与视频制作日益盛行的今天&#xff0c;人声提取软件成为了许多创作者不可或缺的工具。无论是想要从复杂的音乐中分离出纯净的人声&#xff0c;还是希望从视频中提取出精彩的对话片段&#xff0c;一款简单有效的人声提取工具尤为重要&#xff0c;下面给大家分享4种简单…

WTM的项目中EFCore如何适配人大金仓数据库

一、WTM是什么 WalkingTec.Mvvm框架&#xff08;简称WTM&#xff09;最早开发与2013年&#xff0c;基于Asp.net MVC3 和 最早的Entity Framework, 当初主要是为了解决公司内部开发效率低&#xff0c;代码风格不统一的问题。2017年9月&#xff0c;将代码移植到了.Net Core上&…

三菱FX3U进阶课程-运动控制讲解

如果你不会用三菱FX3U系列plc做运动控制&#xff0c;不会控制步进电机、不会控制伺服电机&#xff0c;那来学习本课程就对了&#xff0c;课程带你的价值是&#xff1a; 1、究竟PLC是怎么控制得了步进电机、伺服电机的&#xff1f;好奇怪啊&#xff0c;为啥别人会&#xff0c;我…