JS宏进阶:正则表达式介绍

正则表达式(Regular Expression)是一种用于匹配字符串中字符组合的模式。它使用特定的语法和字符,可以高效地查找、替换或验证字符串中符合规则的内容。正则表达式在许多编程语言中都有广泛的应用,JavaScript也不例外。

一、正则表达式概述

1、普通字符与元字符

普通字符:大多数字符仅能够描述它们本身,如字母、数字等。例如 a 匹配 a,1 匹配 1 等。

元字符:具有特殊含义的字符,可以极大提高正则表达式的灵活性和匹配功能。总结如下

符号解释
.英文状态下的小数点,代表除换行符之外的任何单个字符。
*英文状态下的星号,表示匹配前面的字符或子表达式零次或多次。
+英文状态下的加号,表示匹配前面的字符或子表达式一次或多次。
?英文状态下的问号,表示匹配前面的字符或子表达式零次或一次。
{n}n代表数字,用花括号括起来表示前面的字符或子表达式恰好出现 n 次。
{n, m}n, m都是数字,用花括号括起来表示前面的字符或子表达式恰好出现 n 次但不超过m次。
^按键shift+6输入,表示输入字符串的开始位置。如:^a,表示开头是a
$按键shift+4输入,表示字符串的结束位置。如:a$,已a结尾
[abcd]字符类,表示匹配方括号中的任意一个字符。
[^abcd]否定字符类,匹配不在方括号中的任意一个字符。
|或操作符,匹配左侧或右侧的任意一个模式。
\转义字符,用于将元字符或特殊字符转义为普通字符,或引入特殊序列。比如:\[
\d匹配一个数字,等价于:[0-9]
\D匹配一个非数字字符,等价于:[^0-9]
\w匹配一个字母、数字或英文下划线,等价于:[A-Za-z0-9_]
\W匹配一个非字母、数字或英文下划线的字符,等价于:[^A-Za-z0-9_]
\s匹配任何一个空白符,等价于:[ \f\n\r\t\v]
\S匹配一个不属于空白符的任何字符,等价于:[^\s]
\b匹配一个单词边界,即字与空格之间的位置。
\B非单词边界。
\t制表符,一个tap键(大写锁定上方按键),相当于四个空格
\n换行符,相当于一个enter键
\f匹配一个换页符
\v匹配一个垂直制表符
( )分组,用于提取匹配的部分或应用量词。
(?:pat)非捕获组,用于分组但不捕获匹配的结果。
(?=pat)正向肯定预查,匹配某个模式,但不消耗字符。
(?!pat)负向肯定预查,匹配某个模式不存在的位置。
(?<=pat)正向否定预查,匹配某个模式前面的位置。
(?<!pat)负向否定预查,匹配某个模式不存在的位置。

顺便一提:\Z 也是一个元字符,它匹配字符串的结束位置。如果字符串以换行符结尾,\Z 会在换行符之前的位置匹配,而不是在字符串的末尾匹配。这个“增强”是由 Perl 引入的,并被许多正则表达式引擎所复制,包括 Java、.NET 和 PCRE(Perl Compatible Regular Expressions),但并不是所有引擎都支持,在WPS编辑器中,部分关于\Z的写法无法生效。

2、字符类与字符范围

字符类:是使用元字符 [ ] 来定义的,可以匹配方括号中的任意一个字符。例如:[abc]表示匹配一个a、b或c

字符范围:在方括号中使用连字符 - 表示一个范围。例如,[a-z]:表示任意一个小写字母。

3、量词

量词用于指定某个模式出现的次数(也就是 "."、"*"、"?"等元字符构成的),可以单独使用,也可以与字符类、字符组等结合使用。例如:

\d+:匹配一个以上的数字

\w+:匹配一个或以上的字母、数字或下划线

\d{1, 11}:匹配一个以上,但不超过11个的数字字符

4、边界符

指元字符中表示边界的符号,例如:"^" 、 "$" 、 "\b" 、"\B" 等。

5、捕获组与非捕获组

捕获组:使用小括号( )将一部分正则表达式括起来,可以将匹配到的字符串保存到一个临时变量中,以便后续使用。例如:(\d{4}-\d{2}-\d{2})可以捕获年、月、日。 

非捕获组:使用 (?:) 创建的非捕获组,不会将匹配到的字符串保存到临时变量中,但可以作为整体进行匹配。

6、预查

正向肯定预查:使用(?=pat)来创建,其中pat是你希望出现在当前位置之后但不包括在匹配结果中的模式。例如:[a-z](?=\d+)表示确保这些小写字母后面跟着至少一个数字,但数字本身不会被包括在匹配结果中。假设有字符串foo12opr25or3,使用上述示例正则的匹配结果就是:

["foo", "opr", "or"]

负向肯定预查:使用(?!pat)来创建,检查当前位置后面是否出现特定的模式。如果后面的字符序列不符合指定的模式,则匹配成功;否则,匹配失败。它不会将检查的模式pat匹配出来,仅将其用于条件判断。并且,不会改变匹配过程中的字符位置,即匹配失败后,会立即在当前位置尝试下一次匹配,而不会跳过任何字符。常常用于验证格式。比如:Windows(?!95|98|NT)表达式去匹配Windows 3.1中的Windows,就能匹配成功,因为3.1不在排除列表中,如果用它匹配 Windows 95 或者 Windows 98 就会匹配失败。

正向否定预查:使用(?<=pat)来创建,用于匹配一个位置,该位置的前面不能紧跟模式pat。它不会消耗(匹配)前面的字符,它只用于检查前面的字符是否不满足特定模式。如果不满足(即前面的字符不是指定的模式),则匹配当前位置,并继续向后匹配;如果满足(即前面的字符是指定的模式),则匹配失败。比如:用\b(?<!un)\w+表达式匹配字符串"unhappy, happy, unusual, usual, unique, quick",将匹配将匹配“happy”、“usual”、“quick”,而不会匹配以“un”开头的单词。因为un已经被否定了。再如表达式\b(?<!\d{2}/\d{2}/)\d{4}可以用来排除格式为“MM/DD/YYYY”的日期。

负向否定预查:使用(?<!pat)来定义,它用于匹配一个位置,确保该位置的前面没有紧跟指定的模式 pat。同样的,它不会消耗(即不会包括在匹配结果中)前面的字符,它只是检查前面的字符是否不满足特定模式。如果不满足(即前面的字符不是指定的模式),则匹配当前位置;如果满足(即前面的字符是指定的模式),则匹配失败。例如:表达式 ^(?!.*\berror:\b).*$ 可以匹配一个不以error:结尾的文本。

二、应用场景

正则表达式在多个领域有广泛应用,包括但不限于:

数据验证:验证手机号码,邮箱等字符串是否符合特定的格式。

文本的搜索和提取:从大量文本中查找特定的模式或关键词,提取网页中的特定信息(如链接、标题等)。

文本处理与转换:替换特定的文本模式,清理和格式化文本(如删除特殊字符、转换大小写等)。

变成语言:在代码中处理字符串的复杂需求,如语法检查、日志分析等。

命令行工具:如grep、awk等,支持正则表达式来处理文本。

在WPS编辑器中,常用来匹配表格中的文本是否满足某种格式,例如:身份证号码是否是大陆身份证,还是临时通行证等;也常用来提取特定文本等等。

三、常用正则实例

1、验证电子邮件地址

^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

2、验证电话号码

^\d{3}-\d{3}-\d{4}$

3、匹配中文字符

[\u4e00-\u9fa5]+

4、匹配url

^(https?://)[^\s/$.?#].[^\s]*$

四、注意点

1、模式复杂度:复杂的正则表达式可能导致性能问题,特别是在处理大量文本时。

2、引擎差异:不同的正则表达式引擎(如 Perl、Python、Java 等)可能在语法和性能上存在差异。

3、可读性:编写正则表达式时,应尽量保持其可读性和可维护性,避免过度复杂。

五、总结

总体而言,正则表达式是一种非常实用的工具。理解和掌握正则表达式,在面对复杂文本时,可以加速处理。例如,通过爬虫获取到网页源码,可以通过正则来获取其中包含的信息。

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

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

相关文章

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录&#xff1a; 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…

ARP 表、MAC 表、路由表、跨网段 ARP

文章目录 一、ARP 表1、PC2、路由器 - AR22203、交换机 - S57004、什么样的设备会有 ARP 表&#xff1f; 二、MAC 表什么样的设备会有 MAC 表&#xff1f; 三、路由表什么样的设备会有路由表&#xff1f; 四、抓取跨网段 ARP 包 所谓 “透明” 就是指不用做任何配置 一、ARP 表…

Spring的IoC、Bean、DI的简单实现,难度:※※※

目录 场景描述 第一步&#xff1a;初始化Maven项目 第二步&#xff1a;Maven导入Spring包&#xff08;给代码&#xff09; 第三步&#xff1a;创建Spring配置文件 第四步 创建Bean 第五步 简单使用Bean &#xff08;有代码&#xff09; 第六步 通过依赖注入使用Bean&…

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

C# OpenCvSharp 部署文档矫正,包括文档扭曲/模糊/阴影等情况

目录 说明 效果 模型 项目 代码 下载 参考 C# OpenCvSharp 部署文档矫正&#xff0c;包括文档扭曲/模糊/阴影等情况 说明 地址&#xff1a;https://github.com/RapidAI/RapidUnDistort 修正文档扭曲/模糊/阴影等情况&#xff0c;使用onnx模型简单轻量部署&#xff0c…

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…

LeetCode 110.平衡二叉树

题目描述 给定一个二叉树&#xff0c;判断它是否是平衡二叉树。 示例 1&#xff1a; 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;false 示例 3&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;true 提示&#xff1a; …

Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的…

Express中间件

目录 Express中间件 中间件的概念 next函数 全局中间与局部中间件 多个中间件 中间的5个注意事项 中间的分类 应用级中间件 路由级中间件 错误级中间件 Express内置中间件 express.json express.urlencoded 第三方中间件​编辑 自定义中间件 Express中间件 中间…

Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽

大家读完记得觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 此分享内容比较专业&#xff0c;很多与硬件和通讯规则及队列&#xff0c;比较底层需要有技术功底人员深入解读。 Linux 的带宽管理能力 足以媲美许多高端、专用的带宽管理系统。 1 队列&#xff0…

要获取本地的公网 IP 地址(curl ifconfig.me)

文章目录 通过命令行查询&#xff08;适用于 Linux/Mac/Windows&#xff09;Linux/MacWindows 注意事项 要获取本地的公网 IP 地址&#xff0c;可以通过以下简单的方法&#xff1a; 通过命令行查询&#xff08;适用于 Linux/Mac/Windows&#xff09; Linux/Mac 打开终端。输入…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(七)

文章目录 一、题库管理模块实现1、新增题目功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、题目列表功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询题目列表接口实现2.3.2 后端编辑试题接口实现2.4 效果展示二、代码下载一、题库管…

Python文本处理:LDA主题聚类模型

一、模型简介 LDA&#xff08;Latent Dirichlet Allocation&#xff09;是一种生成式概率模型&#xff0c;用于发现文本数据中隐藏的主题分布。本项目基于Python实现LDA主题模型&#xff0c;包含文本预处理、最佳主题数目选择、关键词提取、词云生成以及PyLDAvis可视化等步骤。…

4.JoranConfigurator解析logbak.xml

文章目录 一、前言二、源码解析GenericXMLConfiguratorlogback.xml解析通过SaxEvent构建节点model解析model节点DefaultProcessor解析model 三、总结 一、前言 上一篇介绍了logback模块解析logback.mxl文件的入口, 我们可以手动指定logback.xml文件的位置, 也可以使用其它的名…

直连EDI与VAN:如何选择更适合企业的数据交换方式

在推进EDI项目时&#xff0c;企业通常会面临两种主要的数据交换方式选择&#xff1a;直连EDI&#xff08;Direct EDI&#xff09;和增值网络VAN&#xff08;Value Added Network&#xff09;。那么&#xff0c;它们之间有什么区别&#xff1f;为什么我们更推荐企业使用直连EDI而…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

如何使用MaskerLogger防止敏感数据发生泄露

关于MaskerLogger MaskerLogger是一款功能强大的记录工具&#xff0c;该工具可以有效防止敏感数据泄露的发生。 MaskerLogger旨在保护目标系统的日子安全&#xff0c;此格式化程序可确保你的日志安全并防止敏感数据泄露。例如使用此格式化程序&#xff0c;打印下列数据&#x…

boss直聘 __zp_stoken__ 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 py代码 import execjs imp…

2024-春秋杯冬季赛

Misc 简单算术 题目提示异或&#xff0c;直接把开头字符 y 与 f 异或&#xff0c;得到的是不可见字符&#xff0c;base64 编码一下得到异或的字符&#xff0c;将给出的每一个字符与编码后的结果异或即可得到 flag import base64result chr((ord("y") ^ ord("…