JavaScript系列——正则表达式
文章目录
- 需求场景
- 正则表达式的定义
- 创建正则表达式
- 通过 / 表示式/ 创建
- 通过构造函数创建
- 编写一个正则表达式的模式
- 使用简单模式
- 使用特殊字符
- 常用特殊字符列表
- 特殊字符
- 组和范围
- 正则表达式使用
- 代码演示
- 常用示例
- 验证手机号码合法性
- 小结
需求场景
在前端开发领域,在日常的开发任务中,你是否遇到以下的需求:
例如:
- 前端表单校验
手机号码是否符合规则? - 用户提交表单中的
身份证件号是否符合大陆居民身份证规则? - 如何提取字符串中出现的数字?
- …等等等
上述类似的需求我们在日常开发中,会遇到很多,JavaScript 为我们提供了一套解决方案,就是正则表达式,我们可以提取需要识别的目标的轮廓,用其构造一个正则表达式对象,通过方法来提取目标对象或者判断是否符合某些规则,下面就来具体说明正则表达式。
正则表达式的定义
正则表达式是用于匹配字符串中的字符组合的模式。它是一个对象,这个对象可以被用于 RegExp(正则表达式)的exec/test和字符串的 match/matchAll/replace/search/split 方法。
创建正则表达式
我们可以使用以下两种方法构建一个正则表达式:
通过 / 表示式/ 创建
var re = /ab+c/;
通过构造函数创建
var re = new RegExp("ab+c");
当JavaScript语句加载后,正则表达式字面量就会被编译,当其保持不变时,使用字面量创建方法,可以提高性能。
编写一个正则表达式的模式
一个正则表达式模式是由字符串构成的,这些字符串可以是数字、字母、特殊符号的组合。
使用简单模式
简单模式直接使用目标字符串构成,比如/abc/ 就是要找到出现abc的字符串,如果abc中间出现空格,那么这种简单的模式,就不能匹配,无法满足我们的需求,就需要用到下面带有特殊字符的模式,这些特殊的字符在正则表示式中,有特别的含义
使用特殊字符
当我们需要匹配一个不太确定的字符串时,比如寻找一个或多个“a” ,或者寻找空格,可以在模式中使用特殊字符,比如使用/ab*c/去匹配单独的“a”后面跟了零个或多个“b”,同时后面跟着“c”的字符串,特殊字符*的含义是,前一项的字符出现零次或者多次。
常用特殊字符列表
下面的页面与表格列出了一个正则表达式中可以利用的特殊字符的完整列表和描述。
特殊字符
| 字符 | 含义 |
|---|---|
| \ | (1)在非特殊字符之前的反斜杠表示下一个字符就是特殊字符,此字符不能按照字面理解,面。例如前面没有 “” 的 “b” 通常匹配小写字母 “b”,但如果前面出现\,它则不会匹配任何字符,在特殊字符之前的反斜杠表示下一个字符不是特殊字符,能够转义 |
| ^ | 表示匹配以下一个字符开始的字符串,例如,/^A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。 |
| $ | 表示匹配以上一个字符结尾的字符串,例如,/t$/ 并不会匹配 “eater” 中的 ‘t’,但是会匹配 “eat” 中的 ‘t’。 |
| * | 匹配一个表达式0次货多次,等价于{0,},例如,/bo*/ 会匹配 “A ghost boooooed” 中的 ‘booooo’ 和 “A bird warbled” 中的 ‘b’,但是在 “A goat grunted” 中不会匹配任何内容。 |
| + | 匹配前面表达式1次或者多次,等价于{1,},例如,/a+/ 会匹配 “candy” 中的 ‘a’ 和 “caaaaaaandy” 中所有的 ‘a’,但是在 “cndy” 中不会匹配任何内容。 |
| ? | 匹配前面表达式出现0次或1次,等价于{0,1},例如,/e?le?/ 匹配 “angel” 中的 ‘el’、“angle” 中的 ‘le’ 以及 "oslo’ 中的 ‘l’。如果这个符号紧跟着任何量词 *、 +、? 或 {} 的后面,则会使得量词变成非贪婪,和没有?符号使用的贪婪模式(匹配尽可能多的字符)正好相反 。例如,对 “123abc” 使用 /\d+/ 将会匹配 “123”,而使用 /\d+?/ 则只会匹配到 “1”。 |
| . | (小数点)默认匹配除换行符之外的任何单个字符。例如,/.n/ 将会匹配 “nay, an apple is on the tree” 中的 ‘an’ 和 ‘on’,但是不会匹配 ‘nay’。 |
组和范围
下面这些组合,表示表达式字符的分组和范围
| 模式 | 含义 |
|---|---|
| (x) | 像下面的例子展示的那样,它会匹配 ‘x’ 并且记住匹配项。其中括号被称为捕获括号。/(foo) (bar) \1 \2/ 中的 ‘(foo)’ 和 ‘(bar)’ 匹配并记住字符串 “foo bar foo bar” 中前两个单词。模式中的 \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 foo 和 bar,匹配了原字符串中的后两个单词。 |
| (?:x) | 匹配 'x' 但是不记住匹配项,这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。看看这个例子 /(?:foo){1,2}/,{1,2} 会应用于整个 'foo' 单词 ,如果表达式是 /foo{1,2}/,{1,2} 将只应用于 ‘foo’ 的最后一个字符 'o' |
| x|y | 匹配‘x’或者‘y’ |
| [xyz] | 一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。例如,[abcd] 和 [a-d] 是一样的。他们都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/与字符串“test.i.ng”匹配。 |
| {n} | n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。 |
| {n,} | n 是一个正整数,匹配前一个字符至少出现了 n 次。 |
| {n,m} | n 和 m 都是整数。匹配前面的字符至少 n 次,最多 m 次。如果 n 或者 m 的值是 0,这个值被忽略。 |
| [\b] | 匹配一个退格 (U+0008)。(不要和\b混淆了。) |
| \b | 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是 0。(不要和 [\b] 混淆了),例如使用"moon例:/\bm/匹配“moon”中的‘m’;/oo\b/并不匹配"moon"中的’oo’,因为’oo’被一个“字”字符’n’紧跟着。/oon\b/匹配"moon"中的’oon’,因为’oon’是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。/\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。 |
| \s | 匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于 [\f\n\r\t\v\u0020\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。 |
| \S | 匹配一个非空白字符。 |
| \w | 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。 |
| \W | 匹配一个非单字字符。等价于 [^A-Za-z0-9_]。 |
| \d | 匹配一个数字。等价于 [0-9]。 |
| [^xyz] | 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。 |
| \D | 匹配一个非数字字符。等价于 [^0-9]。 |
正则表达式使用
下面表格整理了 正则表达式搭配使用的方法
| 方法 | 描述 |
|---|---|
| exec | 在指定的字符串中寻找匹配正则表达式的元素的RegExp 方法,他返回一个数组,未匹配返回null |
| test | 返回在一个字符串中,是否存在符合正则表达式的子串的RegExp 方法,值是true或false |
| match | 一个在字符串中执行查找匹配的 String 方法,它返回一个数组,在未匹配到时会返回 null。 |
| matchAll | 一个在字符串中执行查找所有匹配的 String 方法,它返回一个迭代器(iterator)。 |
| search | 一个在字符串中测试匹配的 String 方法,它返回匹配到的位置索引,或者在失败时返回 -1。 |
| replace | 一个在字符串中执行查找匹配的 String 方法,并且使用替换字符串替换掉匹配到的子字符串。 |
| split | 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。 |
说明:
如果想要知道某些字符串是否存在,你可以使用 test 或 search 方法。想得到更多的信息(但是比较慢)则可以使用 exec 或 match 方法
代码演示
在接下来的例子中,脚本将使用 exec 方法在一个字符串中查找一个匹配。
var myRe = /d(b+)d/g;
var myArray = myRe.exec("cdbbdbsbz");
如果你不需要访问正则表达式的属性,这个脚本通过另一个方法来创建 myArray:
var myArray = /d(b+)d/g.exec("cdbbdbsbz");
// 和 "cdbbdbsbz".match(/d(b+)d/g); 相似。
// 但是 "cdbbdbsbz".match(/d(b+)d/g) 输出数组 [ "dbbd" ],
// 而 /d(b+)d/g.exec('cdbbdbsbz') 输出数组 [ "dbbd", "bb", index: 1, input: "cdbbdbsbz" ].
如果你想通过一个字符串构建正则表达式,那么这个脚本还有另一种方法:
var myRe = new RegExp("d(b+)d", "g");
var myArray = myRe.exec("cdbbdbsbz");
通过这些脚本,匹配成功后将返回一个数组并且更新正则表达式的属性,如下表所示。

上述例子中,使用了g 这个高级标志,下列还有更多列举一下
| 标志 | 描述 |
|---|---|
| g | 全局检索,从开头到结尾匹配,而不是一匹配就结束 |
| m | 多行检索 |
| i | 不区分大小写 |
为了在正则表达式中包含标志,请使用以下语法:
var re = new RegExp("pattern", "flags");
或者
var re = /pattern/flags;
例如,re = /\w+\s/g 将创建一个查找一个或多个字符后有一个空格的正则表达式,或者组合起来像此要求的字符串。
var re = /\w+\s/g;
var str = "fee fi fo fum";
var myArray = str.match(re);
console.log(myArray);// ["fee ", "fi ", "fo "]
常用示例
验证手机号码合法性
验证手机号码 形如 :136-2119-9812 ,136/2119/9812,136.2119.9812,13621199812 格式。
var re = /(?:\d{3}|\(\d{3}\))([-\/\.]{0,1})\d{4}\1\d{4}/;function testInfo(phoneInput) {var OK = re.exec(phoneInput.value);if (!OK)window.alert(phoneInput.value + " isn't a phone number with area code!",);else window.alert("Thanks, your phone number is " + OK[0]);}
上面代码,通过字面量创建一个正则表达式,
(?: 这个正则表达式寻找三个数字字符 \d{3}, 或者 | 一个左半括号 \( 跟着三位数字 \d{3}, 跟着一个封闭括号 \), (结束非捕获括号 ))。表示前面三个是数字。
后跟着一个短破折号或正斜杠或小数点,随后跟随4个数字字符,当记忆字符 ([-\/\.]) 捕获并记住,里面字符可以出现0次或一次,后面跟着四位小数 \d{4},再后面跟随记住的破折号、正斜杠或小数点 \1,最后跟着四位小数 \d{4}。
小结
- 正则表达式中属于 RegExp 方法有 exec、test,其中exec 返回匹配的数组(可以是多个),所以0是
最长的匹配子串,test返回的是布尔值。 - match 和matchAll 、search、replace和split 属于字符串的方法。
- match 返回也是数组,但
只有一个元素,最长的子串 - matchAll
返回一个迭代器,查找所有匹配的子串
相关文章:
JavaScript系列——正则表达式
文章目录 需求场景正则表达式的定义创建正则表达式通过 / 表示式/ 创建通过构造函数创建 编写一个正则表达式的模式使用简单模式使用特殊字符常用特殊字符列表特殊字符组和范围 正则表达式使用代码演示 常用示例验证手机号码合法性 小结 需求场景 在前端开发领域,在…...
命令行创建Vue项目
Vue项目创建 1. 打开UI界面 在命令行中,执行如下指令: vue ui 2. 打开项目管理器 3. 创建项目 创建项目的过程,需要联网进行,这可能会耗时比较长的时间,请耐心等待。 windows的命令行,容易卡顿,…...
01.PostgreSQL基本SELECT语句
1. SQL简介 SQL 是用于访问和处理数据库的标准的计算机语言。 SQL有两个标准:分别是SQL92和SQL99,他们分别代表了92年和99年颁布的SQL标准,我们今天使用的SQL语言依然遵循这些标准。 注意:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展! 2. SQL分…...
UDP信号多个电脑的信息传输测试、配置指南
最近要做一个东西,关于一个软件上得到的信号,如何通过连接的局域网,将数据传输出去。我没做过相关的东西,但是我想应该和软件连接数据库的过程大致是差不多的,就一个ip和一个端口号啥的。 一.问题思路 多个设备同时连…...
先序+中序还原二叉树【数据结构】
先序中序还原二叉树 题目描述 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入 输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重…...
【全网首发】洛谷P2678 [NOIP2015 提高组] 跳石头
Everyday English You don’t become what you want; you become whatyou believe. —Oprah Winfrey 你不是成为你想要的,你成为你所相信的。 洛谷P2678 [NOIP2015 提高组] 跳石头 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔…...
Gpt指引ubuntu安装java8/11
在Ubuntu系统上安装Java环境通常包括以下几个步骤: 更新软件包索引: 在安装新软件之前,最好先更新Ubuntu的软件包索引。这可以确保你安装的是最新版本的软件包。可以使用以下命令来更新: sudo apt update安装Java: U…...
【MCAL】TC397+EB-tresos之MCU配置实战 - 芯片时钟
本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程,主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分,帮助读者了解TC397芯片的时钟树结构,在后续计算配置不同外设模块诸如通信速率,定时器周期等&…...
最新AI系统ChatGPT网站H5系统源码,支持AI绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图
一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…...
如何在MAC OS中的XCODE下添加 <bits/stdc++.h>
mac上使用的编译器是Clang,但是没有万能头文件bits/stdc.h\,本文介绍如何添加万能头文件 Xcode 版本:15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…...
Maven项目提示Ignored pom.xml问题
1 环境 (1)IDEA开发工具:2022.2.1 (2)JDK:Java17(Spring6要求JDK最低版本是Java17) (3)Spring:6.1.2 (4)Maven 3.8.8 2 …...
SQL学习汇总
数据库将两张没有关联的表进行横向连接数据库将两张表进行横向连接(拼接成一张表的形式显示)_db2 两条记录如果相同就横向显示-CSDN博客 mysql统计某个字段的比例_mysql查询一行某个字段占整个字段sum的比例-CSDN博客 Spark 系列(十二&…...
单片机MCU堆栈概念与区别
C语言中的堆栈是用于存储函数调用、局部变量以及程序执行期间所需的临时数据的内存区域。堆栈由编译器自动管理,是一种后进先出(LIFO)的数据结构。堆栈空间大小指的是分配给堆栈的内存空间大小,它限制了函数调用和局部变量的深度和…...
C#中使用is关键字检查对象是否与给定类型兼容
目录 一、定义 二、示例 三、生成 在程序的开发过程中经常会使用类型转换,如果类型转换不成功则会出现异常,从抛出异常到捕获并处理异常,无形中增加了系统的开销,而且太过频繁地处理异常还会严重地影响系统的稳定性。is关键字可…...
AI时代下,如何看待“算法利维坦”?
ChatGPT的浪潮从2022年袭来后,至今热度不减,呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术......AI真的已经走进了生活的方方面面,我们仿佛已经进入了AI时代,势不可挡。人工智能水平如此之高,不禁…...
Linux上管理不同版本的 JDK
当在 Linux 上管理不同版本的 JDK 时,使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11,并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…...
直方图与均衡化
直方图 统计图像中相同像素点的数量。 使用cv2.calcHist(images, channels, mask, histSize, ranges)函数 images:原图像图像格式为uint8或float32,当传入函数时应用[]括起来,例如[img]。 channels:同样用中括号括起来ÿ…...
Java——猫猫图鉴微信小程序(前后端分离版)
目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手,所以做了一个对自己来说可以完成的…...
PiflowX组件-ReadFromKafka
ReadFromKafka组件 组件说明 从kafka中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HOST“”无是逗号分隔的Ka…...
Ubuntu 安装MySQL以及基本使用
前言 MySQL是一个开源数据库管理系统,通常作为流行的LAMP(Linux,Apache,MySQL,PHP / Python / Perl)堆栈的一部分安装。它使用关系数据库和SQL(结构化查询语言)来管理其数据。 安装…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
