JavaScript:正则表达式

news2024/11/24 2:38:49

JavaScript:正则表达式

    • 什么是正则表达式
      • 正则表达式语法
        • 定义正则表达式
        • 判断是否有匹配的字符串
        • 查找匹配的字符串
      • 正则表达式匹配法则
        • 元字符
          • 边界符
          • 量词
          • 字符类


什么是正则表达式

正则表达式用于匹配字符串中字符的组合模式。
正则表达式会依据其自身语法,来对字符串进行限制,并判断字符串是否满足限制。

就好比在人群中找出一个指定目标,我们可以依据限制条件:黑皮肤,戴眼镜,长发等等来找出符合要求的一个或多个人。而正则表达式就是用于规定限制条件的。

在JavaScript中,正则表达式会被当作一个对象。


正则表达式语法

定义正则表达式

JavaScript提供了两种方法创建正则表达式,在此我只讲解使用多的那种:
语法:

let/var/const 变量名 = /正则表达式/

赋值符号左侧,用关键字定义了一个变量,这个变量最终就是这个正则表达式的对象了。
赋值符号右侧,是两个斜杠引起的内容,在斜杠内部写正则表达式。

示例:
在这里插入图片描述
可以看到,虽然直接输出reg没有得到对象,但是其类型确实为object。

想要使用这个正则表达式,要通过这个对象的方法:


判断是否有匹配的字符串

test()方法可以检测一个字符串是否符合正则表达式的规则,其返回值为布尔值。
语法:

Object.test(被检测的字符串)

Object是正则表达式的对象,被检测到的字符串放在函数的参数里。

首先讲解一个基本的正则表达式匹配法则:当正则表达式中只有一个字符串时,只要在被检测的字符串中出现正则表达式中的字符串,就算匹配成功

案例:
在这里插入图片描述
在案例中,创建了两个正则表达式的对象,其中reg1要求语句中出现UFO,而reg2要求语句中出现科学家
于是在reg1.test()下,含有UFO的字符串输出了true;在reg2.test()下,含有科学家的字符串输出了true。


查找匹配的字符串

exec()方法可以匹配搜索符合正则表达式要求的子字符串的位置和值。
语法:

Object.exec(被检测的字符串)

这个函数的返回值是一个数组,数组内部存储了匹配到的子字符串,匹配到的位置,输入的字符串等信息。

案例:
在这里插入图片描述
可以看到,当字符串符合要求时,就会返回一个数组,数组中第一个元素就是匹配到的子字符串,而第三个元素则是匹配到的子字符串的起始下标;当字符串不符合要求时,返回值就是空。

以上就是JavaScript中的正则表达式基本使用方法,接下来讲解正则表达式本身的匹配法则:


正则表达式匹配法则

元字符

在正则表达式中,字符被分为普通字符和元字符:
普通字符:这种字符只能描述它们自身,例如所有的字母,数字。
元字符:元字符是一种具有特殊含义的字符,它可以描述一大类字符。

比如:
规定用户只能填入26个英文字母,那么我们就需要在正则表达式中输入abcdefg......xyz,把26个字母全部输入一遍,这就很麻烦了。但是有一个元字符:[a-z]可以表示a-z的所有小写字母,这样就把原先的26个字符压缩成了5个字符,极大提高了书写效率。

元字符有非常多,大致可以分为三类:边界符,量词,字符类。接下来我们一一讲解:


边界符

正则表达式中,边界符用于提示字符所处的位置
最常用边界符:

边界符含义
^表示匹配行首的文本(以谁开始)
$表示匹配行尾的文本(以谁结束)

案例:
在这里插入图片描述
可以看到/^科学家/只匹配以科学家开头的字符串,而/UFO$/只匹配以UFO结尾的字符串。

此外还有一个语法,那就是正则表达式以^开头的同时以$结尾的结构,比如/^abc$/这样的正则表达式,其时什么含义?
这可不是表示既要以abc开头,又要以abc结尾。而是表示精确匹配,即这个字符串只能和abc一模一样才可以匹配

案例:
在这里插入图片描述
案例中,不论是同时以UFO开头结尾,或者出现了UFO的语句都无法匹配,只有目标字符串就是UFO三个字母时才能匹配。

在实战中,使用的几乎都是精确匹配,到目前为止其看起来只能匹配一种字符串,但是结合后面得到量词和字符类,精确匹配也可以匹配不同类型的字符串。


量词

量词用于设定某个模式出现的次数。
常见量词:

量词说明
*重复零次或者更多次
+重复一次或者更多次
?重复零次或者一次
{n}重复n次
{n,}重复n次或者更多次
{n,m}重复n到m次

如果被重复的部分超过了一个字符,需要用括号括起来,否则只重复量词紧挨着的字符。

我们接下来用一个案例看看用法:
在这里插入图片描述
案例中,正则表达式设置为了/^(UFO)*$/即UFO这个整体要重复出现0次或更多次,所以哪怕是一个空字符串,由于UFO出现了0次,依然符合要求。

那么后面的就是一样的规则了,我再讲解一个{n,m}的案例:
在这里插入图片描述
案例中,只有重复次数在[2,4]区间内的字符串才满足匹配要求。
注意:{n,m}之间不允许出现任何空格,必须连着写

在以上案例中,我们使用了精确匹配,精确匹配的要求是,必须完全符合内部表达式,我为大家解释几个正则表达式的含义,为大家加深一下精确匹配的作用:
/^(UFO){2,4}$/,字符串必须是由UFO重复2-4次才可以匹配
/^(UFO){2,4}/,字符串必须由UFO重复2-4次开头,(实际作用是:必须以UFO重复两次及以上开头
/(UFO){2,4}$/,字符串必须由UFO重复2-4次结尾,(实际作用是:必须以UFO重复两次及以上结尾
/(UFO){2,4}/,字符串中必须出现2-4个UFO连在一起,(实际作用是:字符串中必须有两个UFO连在一起
为何后三者的实际作用与语法上看起来不同?
这是因为后三者的匹配规则是,只要目标字符串的子字符串符合要求,那么其就可以和正则表达式匹配。
比如/^(UFO){2,4}/对于这个正则表达式,请问UFOUFOUFOUFOUFO被发现可以匹配吗?
UFOUFOUFOUFOUFO被发现这个字符串中,是以5个UFO开头的,好像不满足/^(UFO){2,4}/这个表达式,但是其子字符串满足要求
我们可以将UFOUFOUFOUFOUFO被发现拆分为以下情况:

UFOUFO + UFOUFOUFO被发现,以两个UFO重复开头,满足/^(UFO){2,4}/要求
UFOUFOUFO + UFOUFO被发现,以三个UFO重复开头,满足/^(UFO){2,4}/要求
UFOUFOUFOUFO + UFO被发现,以四个UFO重复开头,满足/^(UFO){2,4}/要求

可以发现,/^/只要求以xxx开头,所以我们可以拆分出很多符合要求的开头,就算有多余的UFO超过了重复次数的限制,那就不把它当作开头。所以最后的效果就是:必须以UFO重复两次及以上开头。
后两者也就是一个意思了。


字符类
  • [] 匹配字符集

匹配字符集可以用于对某个字符进行多样匹配,比如[abc]表示一个字符可以是abc中的任何一个。

案例:
在这里插入图片描述
/^[UFO]$/这个正则表达式中,要求一个字符是UFO三者中的任意一个,所以前三个字符串都输出了true。
那为什么第四个UFO却输出了false?
这是因为一个[]只能匹配一个字符,对于/^[UFO]$/这个正则表达式,由于精确匹配的原因,其实际含义为:只能出现一个字符,且这个字符必须是UFO三者之一。

如果想要使用[]匹配字符,那就需要结合前面的量词一起使用。
比如:
/^[UFO]*$/表示一个字符串中,只能有UFO三种字母构成,长度不限;

再来一个稍微复杂点的:
/^[UFO]{2,4}[科学家]?$/

这串正则表达式可以拆分为两个部分:[UFO]{2,4}以及[科学家]?
[UFO]{2,4}表示必须存在2-4个字符,且这2-4个字符必须由UFO三个字符组合成
[科学家]?表示必须存在0或1个字符,且必须由科学家三个字符组合成

最后这个正则表达式从左往右判断就是:
一开始必须存在2-4个字符,且这2-4个字符必须由UFO三个字符组合成,然后必须存在0或1个字符,且必须由科学家三个字符组合成

我再分析以下下面这个输出结果帮助大家理解:
在这里插入图片描述

UFO:
一开始存在三个字符,且都是UFO之一,符合[UFO]{2,4}要求;
接着没有字符了,即存在0个字符,符合[科学家]?要求;

F:
一开始存在一个字符,是UFO之一,不符合[UFO]{2,4}的数量要求;

FUO科:
一开始存在三个字符,且都是UFO之一,符合[UFO]{2,4}的数量要求;
接着存在一个字符‘科’,符合[科学家]?要求;

UF科学家:
一开始存在两个字符,且都是UFO之一,符合[UFO]{2,4}要求;
接着存在三个个字符‘科学家’,不符合[科学家]?的数量要求;

可以发现精确表达也可以通过量词的限定,来实现匹配不同长度的字符串。


  • [-] 范围表示匹配字符集

上述匹配字符集[]是以枚举的形式,其实我们也可以给定一个范围,匹配范围内的字符。

常用值:

字符类作用
[a-z]匹配所有小写的字母
[a-zA-Z]匹配所有的大小写字母
[0-9]匹配0-9的数字
  • ^ 取反符号

在正则表达式的一开始,我们提到^表示以xxx开始,但是那是在//之间的情况下;
^[]之间,表示取反,即:匹配除了xxx以外的字符。

比如:/^[^a-z]$/表示匹配除了a-z以外的所有字符、


  • . 匹配除换行符以外的所有单个字符

如果你在某个字符的位置,不想限制用户的输入,任其自由发挥,你就可以使用 . 这个字符类。
注意:一个 . 只匹配一个字符,如果想让多个字符随意输入,需要加量词


  • 预定义

预定义是指某些常见模式的简写形式。

预定类说明
\d[0-9]的简写形式
\D[^0-9]的简写形式
\w[A-Za-z0-9_]的简写形式
\W[^A-Za-z0-9_]的简写形式
\s匹配空格(包括换行符,空格符,制表符等)
\S匹配非空格

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

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

相关文章

电脑怎么检测手机配置信息

目录 摘要 引言 用户登录工具和连接设备 查看设备信息,电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 摘要 本文介绍了如何使用克魔助手工具在电脑上检测手机的配置信息。通过该工具,用户可以全面了解手机的硬件和操作系统信息&#xff…

大语言模型发展史

前言 2023年可谓是生成式AI元年,大语言模型从崭露头角到锋芒毕露,已然成为人工智能领域的关键推动力。这一创新性的技术不仅在自然语言处理领域崭露头角,更深刻地改变了我们对人机交互、智能助手和信息处理的认知。那么大语言模型的发展历程…

STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1 、时钟树配置 3.1.2、外设参数配置 3.1.3 、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 …

听GPT 讲Rust源代码--src/tools(34)

File: rust/src/tools/clippy/clippy_lints/src/collection_is_never_read.rs 文件"collection_is_never_read.rs"位于Rust源代码中的clippy_lints工具中,其作用是检查在集合类型(如Vec、HashMap等)的实例上执行的操作是否被忽略了…

[Angular] 笔记 19:路由参数

油管视频 Route Parameters 路由参数是跟在 url 后面的数字,字符串,或者 数字字符串,例如如下 url 中的 123,此类参数会传给后端: www.facebook.com/profile/123 首先将 pokemon-template-form 组件移到 pokeman-ba…

【开源】基于Vue+SpringBoot的房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

Matlab:BP神经网络算法,二叉决策树

1、BP神经网络算法 (1)步骤 1.准备训练数据和目标值 2.创建并配置BP神经网络模型 3.训练BP神经网络模型 4.用BP神经网络模型预测数据 例:某企业第一年度营业额为132468,第二年度为158948,第三年度为183737,预测第四年度的营…

相位相关匹配法的opencv C++实现

前言:一个图像拼接的小项目,用途场景,显微图像的拼接,或者只包含x,y平移的图像拼接。本来是显微镜拼接工具,MIST的核心拼接代码,matlab版的,已经开源。下面是地址, GitH…

AI面板识别 - 华为OD统一考试

OD统一考试 (B卷) 分值: 100分 题解: Java / Python / C++ 题目描述 AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。 由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2…

Android NDK打包armeabi平台架包

NDK打包armeabi 1.降低NDK版本和Cmake版本 sdk.dirE\:\\Android\\sdk //指定ndk版本,不指定默认使用最新的NDK ndk.dirE\:\\Android\\sdk\\ndk\\16.1.4479499修改builde.gradle(app) android{defaultConfig{...//配置 AS 工程的 C/C 源文件编译参数externalNativ…

帆软FineBi V6版本经验总结

帆软FineBi V6版本经验总结 BI分析出现背景 ​ 现在是一个大数据的时代,每时每刻都有海量的明细数据出现。这时大数据时代用户思维是:1、数据的爆炸式增长,人们比起明细数据,更在意样本的整体特征、相互关系。2、基于明细的“小…

香橙派 ubuntu实现打通内网,外网双网络,有线和无线双网卡

当香橙派 ubuntu 连了有线,和无线时,默认请求外网时,只走一个网卡,如走了内网网卡,就只能访问内访问,访问不了外网;走了外网网卡就只能访问外网,访问不了内网; 实现双网…

如何使用Docker将.Net6项目部署到Linux服务器(三)

目录 四 安装nginx 4.1 官网下载nginx 4.2 下载解压安装nginx 4.3 进行configure 4.4 执行make 4.5 查看nginx是否安装成功 4.6 nginx的一些常用命令 4.6.1 启动nginx 4.6.2 通过命令查看nginx是否启动成功 4.6.3 关闭Nginx 4.6.5 重启Nginx 4.6.6 杀掉所有Nginx进程 4.…

嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录

机缘巧合 机缘巧合下, 在爱芯元智的xx开发板下进行sdk的开发.由于开发板目前我拿到是当前最新的一版(估计是样品),暂不公开开发板具体型号信息.以下简称板子 .很多优秀的芯片厂商,都会提供与开发板配套的完善的软件以及完善的技术支持(FAE),突然觉得爱芯…

C/C++转WebAssembly及微信小程序调用

上一篇文章讲了C/C如何转WebAssembly,并测试了在Web端调用。本篇内容和上篇一样,介绍C/C包转的.wasm包如何在小程序中调用。 说明 本篇是在上一篇步骤1-4的基础上,再做修改,供微信小程序端调用的方法和步骤。 本篇操作手册可以…

burpsuite模块介绍之repeater

导语 repeater是一个用于手动操作和发送个别HTTP请求的简单工具,它可以帮助您分析应用程序的响应。您可以使用repeater从Burp Suite的任何位置发送内部请求,然后修改请求并发送。通过这种方式,您可以测试和调试应用程序,并对请求…

思福迪运维安全管理系统 任意文件读取漏洞

产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机 漏洞概述 由于思福迪运维安全管理系统 GetCaCert路由存在任意文件读取漏洞,攻击者可通过该漏洞在服务器端读取任意文件敏感内容,可能导致攻击者后续获取到相关的服务器权限 资…

nginx设置跨域访问

目录 一&#xff1a;前端请求 二&#xff1a;后端设置 网站架构前端使用jquery请求&#xff0c;后端使用nginxphp-fpm 一&#xff1a;前端请求 <script> $.getJSON(http://nngzh.youjoy.com/cc.php, { openid: sd, }, function(res) { alert(res); if(res.code 0) …

提升Windows系统安全性的一些有效的策略

假设一个杀猪的机器人感染了病毒&#xff0c;把人识别成了猪&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c; 1&#xff1a;我偶然发现的&#xff1a;把所有向外的UDP都禁止&#xff0c;但是要开放53号端口&#xff0c;因为这是DNS通讯端口&#xff0c;没有这个…

关于log4j的那些坑

背景&#xff1a;工程中同时存在log4j.xml&log4j2.xml maven依赖如下&#xff1a; 此时工程实际使用的日志文件为log4j.xml 1、当同时设置log4j和log4j2的桥接依赖时 maven依赖如下&#xff1a; 此时启动会有警告日志&#xff1a; 点击告警日志链接&#xff1a;https://…