JavaScript:正则表达式

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.rhkb.cn/news/227095.html

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

相关文章

关键字:abstract关键字

在 Java 中,abstract是一个关键字,用于修饰类和方法。当一个类被声明为抽象类时,它不能被实例化,只能被其他类继承。同时,抽象类可以包含抽象方法,抽象方法没有方法体,只包含方法的签名&#xf…

计算机网络复习5

传输层——端到端 文章目录 传输层——端到端功能传输层的寻址与端口UDPTCPTCP连接管理TCP可靠传输TCP流量控制TCP拥塞控制网络拥塞的处理 功能 从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同…

年度总结和规划

年度总结和规划 目录概述需求: 设计思路实现思路分析1.技术总结2.管理总结3.职业计划比较 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait…

准备用vscode代替sourceinsight

vscode版本1.85.1 有的符号,sourceinsight解析不到。 看网上说vscode内置了ripgrep,但ctrlshiftf在文件里查找的时候,速度特别慢,根本不像ripgrep的速度。ripgrep的速度是很快的。 但今天再查询,速度又很快了&#x…

Python武器库开发-武器库篇之上传本地仓库到Git(三十八)

武器库篇之上传本地仓库到Git(三十八) 当我们在Git中创建远程仓库和进行了SSH key免密登陆之后,我们点击 Your respositories 可以查看我们所创建的远程仓库,如图所示: 如果我们需要将本地的仓库上传到Git,首先我们需要建立一个本…

2023-12-29 服务器开发-centos-安装php8

摘要: 2023-12-29 服务器开发-centos-安装php8 centos-安装php8 必备条件 Minimal CentOS 8 / RHEL 8User with sudo rightsInternet Connection (1) 更新系统 更新系统 $ sudo dnf update $ sudo dnf upgrade 重启系统 $ sudo reboot (2) 启用 EPEL & Remi 软件库…

修改源码,element的el-table合并,处理合并产生的hover样式问题

1、确认自己element-ui的版本号 2、此element-ui下的lib包是修改过hover样式的包,如何替换自己文件下的node_modules中的包 修改后将lib文件夹中文件替换你项目中/node_module/element-ui/Lib中的文件问题??如果替换开发环境中的node_module的包无法升级到测试环境,因为nod…

FPGA设计时序约束十四、Set_External_Delay

一、序言 在时序约束中对clock的约束还存在一种特殊的延时约束set external delay。set external delay如字面含义,设置外部的时延值,但这个外部时延主要是指反馈时延,即信号从FPGA的output端口输出后经过外部电路回到输入端口的时延值。 二…

基于js和html的骰子游戏

介绍: 1.游戏者选择“大”时,三个骰子点数之和为11-18时,游戏者获胜。2.游戏者选择“小”时,三个骰子点数之和为3-10时,游戏者获胜。3.如果游戏者选择具体点数,则根据三个骰子的点数计算,如果与…

AI大模型时代下运维开发探索第二篇:基于大模型(LLM)的数据仓库

在SREWorks社区聚集了很多进行运维数仓建设的同学,大家都会遇到类似的挑战和问题: 数仓中存储大量数据消耗成本,但很多存储的数据却并没有消费。进数仓的ETL学习成本高、管理成本高,相关同学配合度低,以及上游结构改动…

PiflowX组件-ReadFromKafka

ReadFromKafka组件 组件说明 从kafka中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HOST“”无是逗号分隔的Ka…

概率论基础复习题

一、填空题 二、选择题 答案:B 答案:C 答案:C 答案:D。统计量不含任何未知参数。 答案:A 答案:C 样本均值是总体均值的无偏估计;样本方差是总体方差的无偏估计。 答案:B。统计值是一…

机器学习的一般步骤

机器学习专注于让机器从大量的数据中模拟人类思考和归纳总结的过程,获得计算模型并自动判断和推测相应的输出结果。机器学习的一般步骤可以概括为以下几个阶段: 数据收集和准备: 收集与问题相关的数据,并确保数据的质量和完整性。…

熊猫目标检测数据集VOC格式1200张

熊猫是中国的国宝,也是世界上最受人喜爱的动物之一。熊猫以其独特的外貌和与生俱来的文化象征意义而闻名于世。它们是一种大型的食草动物,主要分布在中国中部地区的竹林和高山地带。 熊猫的身形圆润笨拙,黑白分明,拥有圆润的脸庞…

【openlayers-3】加载图标

在OpenLayer3中添加图标有两种方式&#xff0c;一种是通过overlay方式&#xff0c;另一种是通过Feature Style的方式。 1、通过overlay方式添加 <div id"mapCon" style"width: 100%; height: 100%; position: absolute;"></div> <div id…

GPT系列概述

OPENAI做的东西 Openai老窝在爱荷华州&#xff0c;微软投资的数据中心 万物皆可GPT下咱们要失业了&#xff1f; 但是世界不仅仅是GPT GPT其实也只是冰山一角&#xff0c;2022年每4天就有一个大型模型问世 GPT历史时刻 GPT-1 带回到2018年的NLP 所有下游任务都需要微调&#x…

关于java循环结构for

关于java循环结构for 在上一篇文章中&#xff0c;我们了解到了while和do…while的结构以及用法&#xff0c;这篇文章我们主要学习一下最常用的循环结构&#xff0c;for结构&#x1f600;&#xff0c;这个结构理解起来相对while结构会难一些&#xff0c;本篇文章内容会很多&…

Linux LVM逻辑卷

一、LVM的定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小。此外&#xff0c;LVM 的快照功能可以帮助我们快速备份数据。LVM 为…

L1-072:刮刮彩票

题目描述 刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xff0c;数字各不重复&#xff0c;并以 33 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个…

【ArkTS入门】ArkTS开发初探:语言特点和开发特点

什么是ArkTS&#xff1f; ArkTS是一个为鸿蒙组件而生的框架&#xff0c;语法亲人好用。基于TypeScript&#xff0c;ArkTS拓展了声明式UI、状态管理等的能力&#xff0c;从本质上来讲&#xff0c;是TypeScript的扩展&#xff0c;主要服务于前端。 ArkTS的开发可以满足“一次开…