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

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.mzph.cn/pingmian/43626.shtml

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

相关文章

ISO 20000认证:驱动企业IT服务管理变革的利器

在信息技术驱动商业发展的今天,企业对高效、可靠和安全的IT服务需求日益增长。ISO 20000作为国际公认的IT服务管理标准,能够帮助企业在竞争激烈的市场环境中脱颖而出,实现IT服务管理的全面提升。本文将深入探讨ISO 20000认证如何帮助企业优化…

C++第三弹 -- 类与对象(上)

目录 前言一. 面向过程和面向对象的初步认识二. 类的引入三. 类的定义1.定义2. 命名规则建议 四. 类的访问限定符以及封装1. 访问限定符2.面试题3. 封装 五. 类的作用域六. 类的实例化七. 类的对象大小的计算八. 类成员函数this指针1. this指针的引出2. this指针的特性3. C语言…

最新版本的办公工具,你不来尝试一下吗?

前言 大家好,我是小雨,看到最近ONLYOFFICE更新了最新的版本,更新了一下当前版本来具体的测评一下,先来看看官网提供的各类更新信息,下面是我找到的三个主页,包括功能演示链接,官网连接以及专门…

能源电子领域2区SCI,版面稀缺,即将截稿,无版面费!

【SciencePub学术】今天小编给大家推荐1本能源电子领域的SCI!影响因子1.0-2.0之间,最重要的是审稿周期较短,对急投的学者较为友好! 能源电子类SCI 01 / 期刊概况 【期刊简介】IF:1.0-2.0,JCR2区&#xf…

羊大师:探索羊奶奥秘,解锁免疫力提升新篇章

在浩瀚的自然界中,羊奶以其独特的营养价值和健康益处,悄然成为提升免疫力的新宠。自古以来,羊奶就被视为珍贵的滋补佳品,而今,随着科学的深入探索,其提升免疫力的奥秘正逐渐揭开面纱。 羊奶中富含的免疫球蛋…

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

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

java中 使用数组实现需求小案例(二)

Date: 2024.07.09 16:43:47 author: lijianzhan 需求实现: 设计一个java类,java方法,使用Random函数,根据实现用户输入随机数生成一个打乱的数组。 package com.lin.java.test;import java.util.Arrays; import java.util.Rando…

TAGE predictor

参考文档:分支预测算法(一):TAGE|SunnyChen的小窝 TAGE的基础概念 TAGE是现今最经典的分支预测算法,TAGE及其后续的变体都是当今高性能微处理器的分支预测算法基础。因此,要聊分支预测算法的话题必定绕不开…

uniapp内置组件uni.navigateTo跳转后页面空白问题解决

文章目录 导文空白问题 导文 在h5上跳转正常 但是在小程序里面跳转有问题 无任何报错 页面跳转地址显示正确,但页面内容为空 空白问题 控制台: 问题解决: 方法1: 可能是没有注册的问题,把没注册的页面 注册一下。 方…

数据库基础练习4

准备 create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8;insert into dept values(101,财务),(102,销售),(103,IT技术),(104,行政);INSERT …

WANGLS

DHCP 动态主机配置协议 原理 网络 网络是双向的,网络是有方向的 广播;广播是由种类的,广播是有范围的的 租约的建立——租约的相应、租约的选择——租约的完成 租约的建立:租约的请求 有客户端发出 DHCP discover 广播、寻找服务器 租约的响应 收到响应,不是服务器,…

模块一SpringBoot(一)

maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置, application.properties会覆盖默认信息: 如覆盖端口号server.port8888

提升校园管理效率!智慧校园人事管理的职工培训功能解析

在智慧校园的构建框架下,人事管理系统中关于职工培训的部分,扮演了一个促进师资力量成长与个人职业规划深度融合的角色。这一模块细腻地融合了现代教育的需求与教职工个人发展的期望,为提升教学团队的整体实力铺设了一条高效路径。 首先&…

为什么3d模型在透视里面闪烁?---模大狮模型网

在展览3D模型设计中,透视效果是展示空间深度和立体感的重要手段。然而,有时候我们会面对3D模型在特定透视角度下出现闪烁或者失真的问题。本文将深入探讨这一现象的原因及解决方法,帮助设计师们更好地理解和处理这类挑战。 一、为什么3D模型在…

哪个充电宝口碑比较好?怎么选充电宝?2024年口碑优秀充电宝推荐

在如今快节奏的生活中,充电宝已然成为我们日常生活中的必备品。然而,市场上充电宝品牌众多,质量参差不齐,如何选择一款安全、可靠且口碑优秀的充电宝成为了消费者关注的焦点。安全性能不仅关系到充电宝的使用寿命,更关…

记一次mysql迁移Kingbase8

目录 一、下载Kingbase工具二、客户端安装三、数据库开发管理工具 KStudio3.1 主界面3.2 导出数据库建表语句DDL3.3 导出数据 四、数据迁移工具 KDTS4.1 启动KDTS4.2 新建源数据库4.3 新建目标数据库4.4 迁移任务管理 一、下载Kingbase工具 kingbase数据库服务(内置…

集合面试题

1. 什么是集合 集合就是一个放数据的容器,准确的说是放数据对象引用的容器 集合类存放的都是对象的引用,而不是对象的本身 集合类型主要有 3 种: set( 集)、 list( 列表)和 map( 映射 ) 。 2. 集合的特点 集合的特…

软件架构之系统性能评价

软件架构之系统性能评价 第 5 章 系统性能评价5.1 性能指标5.1.1 计算机 5.1.2 网络5.3 性能设计5.3.1 阿姆达尔解决方案5.3.2 负载均衡 5.4 性能评估5.4.1 基准测试程序5.4.2 Web 服务器的性能评估5.4.3 系统监视 第 5 章 系统性能评价 系统性能是一个系统提供给用户的众多性…

四川赤橙宏海商务信息咨询有限公司引领行业发展

随着数字经济的飞速发展,电商行业已成为推动经济增长的重要引擎。在这个大背景下,四川赤橙宏海商务信息咨询有限公司凭借其对抖音电商服务的深度洞察和专业能力,迅速崛起为行业内的佼佼者,为广大企业提供了全方位的电商服务解决方…

Linux学习笔记(二)账户和组

一、基本概念 用 户:用户id,被称为UID 基本组:账户id,被称为GID。用户只能加一个基本组。 0代表超级管理员,root账号。 附加组:用户能加多个基本组。 二、添加账户和组 创建用户名tom,失效…