JS正则表达式

news2025/7/27 21:44:10

文章目录

  • 1、创建正则表达式的方式
    • 1.1、字面量形式
    • 1.2、对象
  • 2、正则方法
    • 2.1、`exec()`
    • 2.2、`test()`
    • 2.3、可以用于正则的string方法
      • 2.3.1、`match()`
      • 2.3.2、`replace()`
        • 补充:`$`在正则替换中的使用
      • 2.3.3、`search()`
      • 2.3.4、`split()`
      • 2.3.5、`matchAll()`
  • 3、边界量词
  • 4、模式修饰符
  • 5、原子表`[]`与原子组`()`
    • 5.1、原子表`[]`
    • 5.2、原子组`()`
      • 例子1:邮箱校验规则
      • 例子2:引用替换
      • 例子3:批量使用正则
  • 6、元字符
  • 7、量词重复匹配
      • ●禁止贪婪
  • 8、断言匹配
    • 8.1、`(?=xxx)`
    • 8.2、`(?<=xxx)`
    • 8.3、`(?!xxx)`
    • 8.4、`(?<!xxx)`
  • 9、汉字与字符属性
  • 10、`lastIndex`属性
  • ▼总结图

1、创建正则表达式的方式

1.1、字面量形式

/^\d$/
  • 测试:
/^\d$/.test('1') // true

const v = 'a'
eval(`/^${v}$/`).test('a') // true

1.2、对象

const reg = new RegExp('^\\d$', 'g') // 正则表达式语句, 模式修饰符
reg.test('99') // false

2、正则方法

2.1、exec()

用于检索字符串中的正则表达式的匹配结果。 返回一个存放第一次成功匹配结果的数组。如果未找到匹配,则返回 null

/./.exec('abcd') // ['a', index: 0, input: 'abcd', groups: undefined]
/./.exec('') // null

2.2、test()

用于检测一个字符串是否匹配某个模式,返回 boolean

/^\d$/.test('1') // true
/^\d$/.test('a') // false

2.3、可以用于正则的string方法

2.3.1、match()

将字符串中匹配的内容捕获出来,若加上量词g则一次性捕获所有匹配的内容放到数组里返回,若不加则与exec()的返回值一样

'\nabcd\n123'.match(/./) // ['a', index: 1, input: 'abcd', groups: undefined]
'\nabcd\n123'.match(/./g) // ['a', 'b', 'c', 'd', '1', '2', '3']

2.3.2、replace()

用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串

'\nabcd\n123'.replace(/\d/, '+') // '\nabcd\n+23'
'\nabcd\n123'.replace(/\d/g, '+') // '\nabcd\n+++'

// 小例子:替换座机号格式
const tels = '(010)9999999 (020)88888888'
console.log(tels.replace(/\((\d{3,4})\)(\d{6,7})/g, '$1-$2')) // 010-9999999 020-88888888

// 小例子:原子组在替换中的小技巧:把有数字的连续区间替换成一个-,@替换成&
const exc = 'abc.01+2def8g@hi99+'
console.log(exc.replace(/(\d+|@)/g, (item, ...args)=>{ // 第一个参数是匹配到的内容,后面就是正则表达式里所有的原子组
	args[0] = item === '@' ? '&' : '-'
    return args[0]
})) // abc.-+-def-g&hi-+

补充:$在正则替换中的使用

  • `$``:表示匹配内容前面的内容
  • $&:表示匹配的内容
  • $':表示匹配内容后面的内容
// 把文字左右两侧的内容展示双份
const word = '-=文字+-'
console.log(word.replace(/文字/, "$`$`$&$'$'")) // -=-=-=文字+-+-+-

2.3.3、search()

返回值是相匹配的子串的起始位置。 方法不执行全局匹配,它将忽略标志 g

'\nabcd\n123'.search(/./) // 1
'\nabcd\n123'.search(/./g) // 1 忽略g,写了也无效

2.3.4、split()

字符串的分割 ,返回一个数组。正则可以匹配它的分割方式

'\nabcd\n123'.split(/./) // (8) ['\n', '', '', '', '\n', '', '', '']

2.3.5、matchAll()

用于完成全局匹配

// 例子:取出标签里的所有内容
const htmlText = `
	<h1>AAAAA</h1>
	<h2>BBBBB</h2>
	<h3>CCCCC</h3>
`
const ht = htmlText.matchAll(/<(h[1-6])>([\s\S]+?)<\/\1>/gi)
let all = []
for(const item of ht){
    all.push(item[2])
}
console.log(all) // (3) ['AAAAA', 'BBBBB', 'CCCCC']

3、边界量词

  • ^:开始
  • $:结束
// 例子:校验以数字开始以字母s结尾的长度为2的字符串
/^\ds$/.test('1') // false

4、模式修饰符

  • i:不区分大小写
  • g:全局匹配
  • m:多行匹配
  • u\p语法使用
  • y:连续匹配,与g的区别就是遇到不匹配的直接停止匹配
  • s:。。。

模式修饰符可以一起使用,前后顺序无所谓

/aBc/igm<==>/aBc/mgi


5、原子表[]与原子组()

5.1、原子表[]

不是整个匹配,而是按照单一字符匹配

  1. 区间匹配(只能是升序)
    1. [a-e]表示匹配abcde
    2. [0-5]表示匹配012345
  2. 排除匹配^
    1. [^abc]表示排除abc;既不能是a也不能是b和c
  3. 注意:原子表内字符不会被解析

5.2、原子组()

  1. 原子组与原子表相通的关系: (a|b|c|d) <==> [abcd]

  2. 选择匹配 |

    1. // 例子:匹配字符串 abc 或者 bcd
      /(abc|bcd)/.test('mabce') // true
      
  3. 分配原子组达到统一格式的目的(匹配的下标是从1开始\1\2\3\...

    1. // 例子:日期格式校验 2022-11-18 2022/11/18
      /^\d{4}[-\/]\d{2}[-\/]\d{2}$/ // 这样导致 2022/ 11-18 这种格式也会匹配成功,这里就需要用到原子组
      
      // 原子组改进版日期格式校验
      /^\d{4}([-\/])\d{2}\1\d{2}$/
      
  4. 不记录组 (?:x)

  5. 原子组取别名(?<别名>x);获取用$<别名>

    1. console.log('<h1>555</h1>'.replace(/<(h[1-6])>(.*?)<\/\1>/, '<h4>$2</h4>')) // <h4>555</h4>
      console.log('<h1>555</h1>'.replace(/<(h[1-6])>(?<context>.*?)<\/\1>/, '<h4>$<context></h4>')) // <h4>555</h4>
      

例子1:邮箱校验规则

/*
邮箱校验规则:
    1、@之前必须有内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.)
    2、@和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着
	3、最后一个点(.)之后必须有内容且内容只能是字母(大小写)、数字且长度为大于等于2个字节,小于等于6个字节
*/
/^[\w-\.]+@([a-zA-Z\d-]+\.)+[a-zA-Z\d]{2,6}$/

例子2:引用替换

通过$i引用对应下标的原子组

const hd = `
	<h1>hahaha</h1>
	<span>哈哈哈</span>
	<h2>~~~</h2>
`
const reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi
console.log(hd.replace(reg, `<p>$2</p>`))
/*

	<p>hahaha</p>
	<span>哈哈哈</span>
	<p>~~~</p>
*/

例子3:批量使用正则

// 验证密码包含5-10位数字和字母混合且必须包含大写字母
const res = [/^[a-z\d]{5,10}$/i, /[A-Z]/, /\d/].every(r=>r.test('这是你的神奇小密码'))

6、元字符

元字符描述
.查找任意单个字符(除了换行和行结束符)
\w查找单词字符(字母、数字、下划线)
\W查找非单词字符
\d查找数字
\D查找非数字字符
\s查找空白字符、空格、制表符、换行符
\S查找非空白字符
\b匹配单词边界(词在[]中无效)
\B匹配非单词边界
\0查找 null 字符
\n查找换行符
\f查找换页符
\r查找回车符
\t查找制表符
\v查找垂直制表符
\xxx查找以八进制数 xxxx 规定的字符
\xdd查找以十六进制数 dd 规定的字符
\uxxxx查找以十六进制 xxxx规定的 Unicode 字符

7、量词重复匹配

量词描述
n+匹配任何包含至少一个 n 的字符串
n*匹配任何包含零个或多个 n 的字符串
n?匹配任何包含零个或一个 n 的字符串
n{x}匹配包含 x 个 n 的序列的字符串
n{x,y}匹配包含最少 x 个、最多 y 个 n 的序列的字符串
n{x,}匹配包含至少 x 个 n 的序列的字符串

●禁止贪婪

重复匹配默认是贪婪匹配,如果要禁止贪婪可在其后面添加?

// 贪婪
/\d*/.exec('123abc')  // ['123', index: 0, input: '123abc', groups: undefined]
// 禁止贪婪
/\d*?/.exec('123abc') // ['', index: 0, input: '123abc', groups: undefined]

8、断言匹配

注意!!!断言不是原子组,只是匹配条件!!!

8.1、(?=xxx)

匹配后面是xxx的项

// 把后面是英文的数字区间替换成-
'123abcd0123Afgh3456ijMlm123'.replace(/\d+(?=[a-z])/gi, '-') // '-abcd-Afgh-ijMlm123'

8.2、(?<=xxx)

匹配前面是xxx的项

// 把前面是英文的数字区间替换成-
'123abcd0123Afgh3456ijMlm123'.replace(/(?<=[a-z]+)\d+/gi, '-') // '123abcd-Afgh-ijMlm-'

8.3、(?!xxx)

匹配后面不是xxx的项

// 把后面不是英文且处在结尾的数字区间替换成-
'123abcd0123Afgh3456ijMlm123'.replace(/\d+(?![a-z])$/gi, '-') // '123abcd0123Afgh3456ijMlm-'

8.4、(?<!xxx)

匹配前面不是xxx的项

// 把前面不是英文且处在开头的数字区间替换成-
'123abcd0123Afgh3456ijMlm123'.replace(/^(?<![a-z])\d+/gi, '-') // '-abcd0123Afgh3456ijMlm123'

9、汉字与字符属性

表示汉字的正则:[\u4e00-\u9fa5]
表示至少一个汉字的正则表达式:^[\u4e00-\u9fa5]
只含有汉字、数字、字母、下划线,下划线位置不限:^[a-zA-Z0-9_\u4e00-\u9fa5]+$


10、lastIndex属性

记录上一次匹配的下标

const exc = 'hmdfc'
const reg = /\w/g // 只有全局模式才会有记忆
console.log(reg.exec(exc)) // ['h', index: 0, input: 'hmdfc', groups: undefined]
reg.lastIndex // 1
console.log(reg.exec(exc)) // ['m', index: 1, input: 'hmdfc', groups: undefined]
reg.lastIndex // 2
// ...
while(res = reg.exec(exc)) {
    console.log(res)
    // ['d', index: 2, input: 'hmdfc', groups: undefined]
    // ['f', index: 3, input: 'hmdfc', groups: undefined]
    // ['c', index: 4, input: 'hmdfc', groups: undefined]
}


参考文档:

  • JS正则表达式语法大全(非常详细)
  • js之正则
  • 前端js正则\p的使用, 全局标志g的问题
  • W3C JavaScript RegExp 参考手册

学习视频:

  • 第十四章 吃通js正则表达式,javascript前端工程师必会技能


▼总结图

在这里插入图片描述

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

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

相关文章

拷贝构造函数详解

拷贝构造函数详解1.概念与特征2.浅拷贝3.深拷贝4.拷贝构造函数典型调用场景&#xff1a;如果一个类中什么成员都没有&#xff0c;那么该类简称为空类。而空类中其实并不是真的什么都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。构造…

对GROUP BY的增强

使用ROLLUP操作产生求和值使用CUBE操作产生使用GROUPING函数确定该行值是由ROLLUP或者CUBE创建的使用GROUPING SETS生成一个简单的结果集[oracleoracle-db-19c ~]$ [oracleoracle-db-19c ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Fri Nov 18 10:…

idea2022.2.3版本下载安装配置(包含运行第一个java程序教程)详细步骤

目录 一、下载idea 1.去浏览器搜索idea官网&#xff0c;找到官网 2.选择Download 3.点击左边的Download下载就好了 4.在本地磁盘建一个文件夹&#xff0c;专门用来存放idea软件的 二、安装idea 5.在本地磁盘中的下载里面找到下载的idea并双击打开 6.选择Next ​编辑 7…

【无标题】PCIe收发卡设计资料原理图:611-基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡

基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡一、板卡概述 基于XCVU9P的5Gsps AD DA收发PCIe板卡。北京太速科技该板卡要求符合PCIe 3.0标准&#xff0c;包含一片XCVU9P-2FLGA2014I、2组64-bit/8GB DDR4、2路高速AD&#xff0c; 2路高速DA&#xff0c;支持外触发&#xff…

基于单片机的学生视力保护仪

目录 摘 要 1 ABSTRACT 2 第一章 绪论 4 1.1课题的选题背景 4 1.2国内外发展现状 5 1.3本论文主要研究内容 6 1.3.1主要内容 6 1.3.2基本要求 7 第二章 学生视力保护仪总系统设计 8 2.1系统总框图 8 2.2单片机的选择 8 2.3传感器的选择 9 2.4编程语言的选择 9 第三章 系统硬件…

CentOS 7 源码制作ngnx-1.22.1-ipv6 rpm —— 筑梦之路

源码包&#xff1a;http://nginx.org/packages/centos/7/SRPMS/nginx-1.22.1-1.el7.ngx.src.rpm # 安装依赖包yum install http://mirror.centos.org/centos/7/os/x86_64/Packages/pcre2-devel-10.23-2.el7.x86_64.rpm# 安装源码包 初始化项目rpm -ivh nginx-1.22.1-1.el7.ngx…

5G无线技术基础自学系列 | 物理下行控制信道

素材来源&#xff1a;《5G无线网络优化实践》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 2.4.1 PDCCH位置定义 在LTE中&#xff0…

ESP32的AP模式使用

WifiClient 和WebServe有啥区别? (14 封私信 / 1 条消息) httpclient 和webservice有啥区别? - 知乎 (zhihu.com) 1.Webservice两大核心&#xff1a;soap&#xff08;理解为要传输的数据&#xff09;、wsdl&#xff08;理解为传输数据xml的说明&#xff09; soap xml ht…

Java类变量和类方法(static)

文章目录类变量-提出问题类变量内存布局如何定义类变量如何访问类变量类变量使用细节类方法介绍类变量-提出问题 提出问题的主要目的就是让大家思考解决之道&#xff0c;从而引出我要讲的知识点. 说:有一群小孩在玩堆雪人,不时有新的小孩加入&#xff0c;请问如何知道现在共有…

客服系统Golang源码

客服系统 概述 采用Golang语言&#xff0c;基于 gRPC [Mongo Vue3WebsocketRabbitMQ]来实现系统 用户侧逻辑采用匿名注册模式&#xff0c;Token采用JWT技术&#xff0c;服务端不保存Token信息&#xff0c;用户每次使用检测Token合法时返回新的Token来达到续期的目的 后端分…

kubernetes集群基于kubeadm部署以及常见问题解决

文章目录集群类型主机规划环境初始化检查操作系统版本关闭防火墙设置主机名主机名解析时间同步关闭 SELinux关闭 swap 分区将桥接的IPv4流量传递到iptables的链开启ipvs安装容器运行时&#xff08;Docker&#xff09;卸载Docker旧版本&#xff1a;安装 gcc 相关安装Docker设置阿…

Vivado_AXI Quad SPI_IP核

填一下前面的坑。 介绍关于Vivado中AXI Quad SPI v3.2的使用方法。 参考资料&#xff1a;pg153-axi-quad-spi.pdf&#xff0c;可自行在官网下载。 以该IP核的Standard SPI Mode的使用为例。 Address Space OffsetRegister NameAccess TypeDefault Value (hex)Description40hS…

【JavaSE】抽象类

前言&#xff1a; 作者简介&#xff1a;爱吃大白菜1132 人生格言:纸上得来终觉浅&#xff0c;绝知此事要躬行 如果文章知识点有错误的地方不吝赐教&#xff0c;和大家一起学习&#xff0c;一起进步&#xff01; 如果觉得博主文章还不错的话&#xff0c;希望三连支持&#xff01…

知物由学 | 弹幕蜂拥而入,智能审核平台如何用技术破局?

导读&#xff1a;弹幕的出现增加了视频观看者的深度参与感&#xff0c;弹幕也逐渐成为国内各大视频网站最基本的评论交互形式&#xff0c;本文将通过网易易盾在弹幕实现原理及交互方式方面的实践&#xff0c;具体介绍弹幕相较于传统聊天室的区别与实践经验&#xff0c;希望能为…

【检索资讯】2022年控制理论与应用国际会议(ICOCAT 2022)已成功被EI检索

ICOCTA 2022&#xff08;www.icocta.org&#xff09; 2022年控制理论与应用国际会议&#xff08;ICOCAT 2022&#xff09;已成功被EI&#xff0c;Scopus检索&#xff0c;作者可自行登录EI数据库查询检索&#xff0c; ICOCTA 2023会议预告 重要信息 会议官网&#xff1a;www.i…

新品速看丨创新微MinewSemi正式推出GNSS高精度卫星定位导航模块

致力于GNSS、蓝牙、Wi-Fi、LoRa、UWB等物联网无线模块研究的一站式供应商——创新微MinewSemi近日推出了数款基于多种卫星导航授时、多星多频、具有低功耗、高灵敏度、抗干扰、高性能的工业级GNSS高精度定位模块。 此次推出的GNSS模块各有特点&#xff0c;满足用户不同需求&…

【LeetCode】用队列实现栈和用栈实现队列(C语言)

目录 1.用队列实现栈 增删 求栈顶元素 判断栈为空 2.用栈实现队列 增删 返回队列开头的数据 判断队列为空 尾言 源码 队列实现栈 栈实现队列 刚讲完栈和队列&#xff0c;LeetCode上有两题栈与队列的互相实现&#xff0c;简单地讲讲思路和实现吧。 1.用队列实现栈 原题地址&am…

婴幼儿蛋白质过敏怎么回事

很多孩子吃了含蛋白质的食物后会出现瘙痒或痱子等过敏症状&#xff0c;甚至全身发红。这是因为一些过敏体质的孩子儿童会对蛋白质过敏。婴儿蛋白质过敏会导致一些严重的问题&#xff0c;那么当婴儿蛋白质过敏发生时&#xff0c;该怎么以下是一个详细的介绍&#xff01;目录蛋白…

[Spring Boot]08 IDEA接入MyBatisCodeHelper代码自动生成器

目录前言一、插件市场安装插件二、使用插件自动生成代码前言 上次介绍了&#xff0c;原生mybatis的方法&#xff1a; 06 Spring Boot接入mybatis通用mapper插件自动生成器。 这次&#xff0c;再介绍下插件MyBatisCodeHelper-Pro的用法&#xff0c;使用此方法更加简单和方便。 …

老照片修复工具哪个好?这几个修复软件你快看看

相信我们很多小伙伴的爷爷奶奶家里都会有很多老照片&#xff0c;这些照片由于年代久远&#xff0c;或多或少都会有些损坏&#xff0c;不是泛黄就是有些褶皱&#xff0c;如果我们想将照片进行流传下去&#xff0c;肯定就是将其修复并重新洗出来啦。要是不想出门找专业的摄影师修…