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 返回一个迭代器,查找所有匹配的子串

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

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

相关文章

C语言 指针

C语言学习! 目录 文章目录 前言 一、指针是什么? 二、指针变量的大小 三、指针和指针类型 四、指针和函数 五、野指针 5.1野指针成因 5.2 如何规避野指针 六、指针运算 6.1 指针- 整数 6.2 指针-指针 6.3 指针的关系运算 总结 前言 指针理解的2个要点&a…

前端Vue中自定义Popup弹框、按钮及内容的设计与实践

标题:前端Vue中自定义Popup弹框、按钮及内容的设计与实践 一、引言 在Web前端开发中,弹框(Popup)是一种常见的用户界面元素,用于向用户显示额外的信息或提供额外的功能。然而,标准的弹框往往不能满足所有…

Django学习3——靓号管理

目录 靓号管理 表结构和数据 根据表结构的需求,在models.py中创建类(由类生成数据库中的表) 在数据库生成表 自己在数据模拟创建一些数据: 靓号列表 新建靓号 编辑靓号 删除靓号 搜索靓号 靓号管理 表结构和数据 根…

DHCP学习记录

目录 客户端向DHCP服务端申请租用IP的4个阶段: 客户端向HDCP服务器续租IP过程: 客户端重新连接租用IP过程: 客户端释放IP 声明: (Dynamic Host Configuration Protocol)动态主机配置协议,客户端向DHCP服务端申请获得ip的一种约定俗成的话语(协议) 手工配置方式…

啊哈c语言——4.10、for隆重登场(一起来找茬)

下面这段代码是求12345678910的值。其中有4个错误&#xff0c; 快来改正吧&#xff01; 改正后&#xff1a; #include <stdio.h> #include <stdlib.h> int main( ) {int i, sum;sum1;for(i1; i<10;i){sumsum*i;}printf("%d", sum);system("paus…

如何在无公网IP环境使用Windows远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

appium安装运行报错的解决方案

appium版本2.3 java17 运行报错&#xff1a; Caused by: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: An unknown server-side error occurred while processing the command. Original error: Could not…

40道MyBatis面试题带答案(很全)

1. 什么是MyBatis &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接…

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

描述 环境&#xff1a;VM4.0.0 VS2015 及以上 现象&#xff1a;方案或流程运行执行之后&#xff0c;就可以获取结果&#xff0c;可以通过获取渲染结果和数据结果&#xff0c; 渲染结果通过绑定渲染控件进行显示。 解答 渲染结果的显示可以通过渲染控件绑定流程或者模块&#x…

RSA加密解密——用shell加密java解密

功能描述 使用shell opensll对明文进行RSA加密&#xff0c;将密文用java的RSA工具对密文解密。这应该是全网第一个同时用到shell和java的RSA加密解密教程。中间有很多坑&#xff0c;都踩过了&#xff0c;可以放心使用代码。 正确的实现流程 shell端 首先生成公钥私钥 &…

【华为机试】2023年真题B卷(python)-冠亚军排名-奖牌榜排名

一、题目 题目描述&#xff1a; 2012伦敦奥运会即将到来&#xff0c;大家都非常关注奖牌榜的情况&#xff0c;现在我们假设奖牌榜的排名规则如下. 1.首先gold medal数量多的排在前面 2.其次silver medal数量多的排在前面 3.然后bronze medal数量多的排在前面 4.若以上三个条…

【数据结构】栈和队列(栈的基本操作和基础知识)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 目录 前言 栈 栈的概念和结构 栈的实现 ​…

【时钟】分布式时钟HLC|Logical Time|Vector Clock|True Time

目录 简略 详细 附录 1 分布式系统不能使用NTP的原因 简略 分布式系统中不同于单机系统不能使用NTP(网络时间协议&#xff08;Network Time Protocol&#xff09;)来获取时间&#xff0c;所以我们需要一个特别的方式来获取分布式系统中的时间&#xff0c;mvcc也是使用time保证读…

信号处理设计模式

问题 如何编写信号安全的应用程序&#xff1f; Linux 应用程序安全性讨论 场景一&#xff1a;不需要处理信号 应用程序实现单一功能&#xff0c;不需要关注信号 如&#xff1a;数据处理程序&#xff0c;文件加密程序&#xff0c;科学计算程序 场景二&#xff1a;需要处理信…

HTML---利用CSS3制作网页动画

文章目录 目录 文章目录 本章目标 一.CSS3概述 CSS函数概述 二.CSS3变形 transform属性 translate()&#xff1a;平移函数 scale()&#xff1a;缩放函数 rotate()&#xff1a;旋转函数 skew()&#xff1a;倾斜函数 三.CSS3过渡 四.CSS动画 练习 旋转按钮 本章目标 会使用…

“从零到一“基于Freeswitch二次开发: 应用架构设计(二)

一、架构分享 上一篇文章“从零到一“基于Freeswitch二次开发:Freeswitch入门与网络架构 (一) 对Freeswitch二次开发做了一个介绍&#xff0c;距离这篇文章的发布时间有点久了&#xff0c;之前一直没时间把下文补上来。正好到了年末想起来&#xff0c;就把我们的一个实现架构进…

深度神经网络结构

单层的感知机不能解决“异或”问题。 在前面分别介绍了M-P神经元模型和感知机模型。在M-P神经元模型中&#xff0c;神经元接收到若干个输入信号&#xff0c;并将计算得到的加权后的总输入&#xff0c;经过激活函数的处理&#xff0c;最终产生神经元的输出。而感知机模型则由两层…

腾讯云标准型S5服务器2核2G、2核4G和4核8G五年机来了

腾讯云五年特价服务器来了&#xff0c;标准型S5云服务器&#xff0c;可选2核2G、2核4G和4核8G配置&#xff0c;一次性购买五年低至2折&#xff0c;免去续费贵烦恼。腾讯云百科txybk.com分享腾讯云5年服务器特价优惠活动、购买条件、云服务器配置及优惠价格&#xff1a; 腾讯云五…

linux文件夹介绍

在linux内核文件夹下面存在着许多文件夹&#xff0c;那么那些文件夹是什么用处呢&#xff0c;下面将为你介绍。 (1)documentation 这个文件夹下没有内核代码&#xff0c;仅仅有一套实用的文档&#xff0c;但这些文档的质量不一。比如内核文档的文件系统&#xff0c;在该文件夹下…

计算机网络——传输层(五)

前言&#xff1a; 最重要的网络层我们已经学习完了&#xff0c;下面让我们再往上一层&#xff0c;对网络层的上一层传输层进行一个学习与了解&#xff0c;学习网络层的基本概念和网络层中的TCP协议和UDP协议 目录 ​编辑一、传输层的概述&#xff1a; 1.传输层&#xff1a; …