Javascript 正则表达式零宽断言

在介绍正则表达式零宽断言这个概念之前,先看一下以下这道有关 javascript 正则表达式的题目:

登录注册流程是前端最常见的业务流程之一,注册流程少不了密码强弱度校验,请实现对密码的校验,要求满足:
包含大小写字母、数字、特殊字符中的至少任意两种,长度8-32位。

什么是零宽断言

零宽断言 匹配字符串而不消耗任何内容。ECMAScript 具有向前执行此操作的前向断言,但该语言缺少向后执行断言所提供的向后执行此操作的方法。通过 lookbehind 断言,人们可以确保一个模式是否在另一个模式之前,例如匹配美元金额而不捕获美元符号。零宽断言是正则表达式中的难点,所以本章节重点从匹配原理方面进行一下分析。零宽断言还有其他的名称,例如"环视"或者"预搜索"等等。

匹配字符串而不消耗任何内容这句话怎么理解?来看以下两个例子:

  1. 正则匹配abc后面的大写字母:
const str="abcDEF";
const reg=/abc([A-Z])/;
console.log(str.match(reg)[1]); // D, 最终匹配结果(match[0])是"abcD"
/abc([A-Z])/.test('abcD'); // true
/abc([A-Z])/.test('abcd') // false
  1. 使用正向肯定预查匹配abc后面的大写字母:
const str="abcDEF";
const reg=/abc(?=[A-Z])/;
console.log(str.match(reg)[1]); // undefined, 最终匹配结果(match[0])是"abc",因为零宽断言"(?=[A-Z])"并不匹配任何字符,只是用来规定当前位置的后面必须是一个大写字母。
/abc(?=[A-Z])/.test('abcD'); // true
/abc(?=[A-Z])/.test('abcd'); // false

正向肯定预查 x(?=y)

表示x只有在y前面的情况才匹配成功,它匹配后面紧跟着指定模式的位置,但不包含该模式,表达式 foo(?=bar) 匹配在"foobar"中的"foo",但不匹配"foobar"中的"bar"。例如,

/\d+(?=%)/.test('100% of US presidents have been male'); // true

这里\d+只在百分号%前匹配数字,所以成功匹配到100。

正向否定预查 x(?!y)

表示x只有在y后面的情况才匹配成功,它匹配后面紧跟着不是指定模式的位置,表达式 foo(?!bar) 匹配在"foobaz"中的"foo",但不匹配"foobar"中的"foo"。例如:

/\d+(?!%)/.test('that’s all 44 of them'); // true

这里\d+只在不在%前匹配数字,所以成功匹配到44。

反向肯定预查 (?<=y)x

表示x只有不在y前面的情况才匹配成功,它匹配前面紧跟着指定模式的位置,但不包含该模式,表达式 (?<=foo)bar 匹配在"foobar"中的"bar",但不匹配"foobar"中的"foo"。例如:

/(?<=[Pp]ython)\s\d/.test('Python 2 and Python 3'); // true

这里\d只在Python后匹配数字,所以成功匹配到2。

反向否定预查 (?<!y)x

表示x只有不在y后面的情况才匹配成功,它匹配前面紧跟着不是指定模式的位置,表达式 (?<!foo)bar 匹配在"bazbar"中的"bar",但不匹配"foobar"中的"bar"。例如:

/(?<!Java)\b\d+\b/.test('Python 2 and Python 3'); // true

这里\d+只在不在Java后匹配数字,所以成功匹配到2和3。

校验密码格式

回顾开头的校验密码格式的问题,可以拆解成两步:1. 包含大小写字母、数字、特殊字符中的至少任意两种;2. 满足长度8-32位;

其中第二步的要求很容易得到:

const PASSWORD_LENGTH_EXP = /^.{8,32}$/
/^.{8,32}$/.test('123456781234567812345678123456781') // false
/^.{8,32}$/.test('12345678') // true
/^.{8,32}$/.test('1234567') // false

解释:

/^.{8,32}$/ 用于匹配一个长度在8到32之间的任意字符序列。

  • ^ 表示匹配字符串的开始位置。
  • . 表示匹配除了换行符之外的任意字符。
  • {8,32} 表示前面的模式(.)要重复出现8到32次。
  • $ 表示匹配字符串的结束位置。

那么如何用正则表示大小写字母、数字、特殊字符中的至少任意两种搭配组合呢?其实换个思路来想这个问题就比较好解了,

大小写字母、数字、特殊字符中的至少任意两种搭配可以是:

  • 字符串结尾不包含除了字母、数字和特定符号之外的字符。
(?!.[^A-Za-z0-9#?!@$%^&-.]$) 使用正向否定预查,断言字符串结尾不包含除了字母、数字和特定符号之外的字符。
  • 字符串不仅由小写字母组成
(?![a-z]$) 使用正向否定预查,确保字符串不仅由小写字母组成。
  • 字符串不仅由大写字母组成。
(?![A-Z]$) 使用正向否定预查,确保字符串不仅由大写字母组成。
  • 字符串不仅由数字组成。
(?![0-9]$) 使用正向否定预查,确保字符串不仅由数字组成。
  • 字符串不仅由特定符号组成。
(?![#?!@$%^&-.]*$) 使用正向否定预查,确保字符串不仅由特定符号组成。

因此,最终的表达式可以是:

const PASSWORD_REG = /^(?!.*[^A-Za-z0-9#?!@$%^&*-\.]$)(?![a-z]*$)(?![A-Z]*$)(?![0-9]*$)(?![#?!@$%^&*-\.]*$).{8,32}$/

可以优化的一个点是可以丰富一下特殊字符的限定范围。

总结

四种零宽断言在处理一些匹配规则时非常有用,可以让正则表达式的匹配更加精确。当需要进行复杂的文本解析处理时,熟练运用零宽断言可以大大提高工作效率。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF 快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。 这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。

如果你有闲暇时间,可以做个知识拓展。 看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

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

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

相关文章

RocketMQ5.0延时消息时间轮算法

前言 RocketMQ 相较于其它消息队列产品的一个特性是支持延时消息&#xff0c;也就是说消息发送到 Broker 不会立马投递给消费者&#xff0c;要等待一个指定的延迟时间再投递&#xff0c;适用场景例如&#xff1a;下单后多长时间没付款系统自动关闭订单。 RocketMQ 4.x 版本的延…

一文搞懂手机卡的定向流量到底是什么!

最近有一些小伙伴对于手机卡流量中包含的定向流量这个概念不是很明白&#xff0c;而且也不知道具体如何使用&#xff0c;今天这个视频&#xff0c;葫芦弟就仔细给大家讲解一下&#xff0c;希望能解开小伙伴们心中的疑惑。废话不多说&#xff0c;我们直接进入正题&#xff01; 首…

linux基本系统配置 - 系统语言、区域和字符集设置详细(rhel8)

最近学到linux语言、字符集等环境配置&#xff0c;感觉这个地方不好理解&#xff0c;所以花了2天之间查了各种网上查了资料&#xff0c;再在自己的系统(rhel8)上验证了以后&#xff0c;写下了这个文章。希望对大家有用。有不足支持还望批评指正。谢谢。 一、关于locale&#x…

Web开发:接口的定义和接口实现设计

一、设计程序 using System;public interface IPrintable //接口定义1 {void Print();void Print2(); }public interface IPrintable2 : IPrintable //接口定义2 {void Print3(); }public class MethodAchieve : IPrintable, IPrintable2 //接口实现1 {public void Print(){Co…

第十四章 :案例课:部暑KVM虚拟化平台

[rootLinux01 ~]# mount /dev/cdrom /mnt //挂载安装KVM需要的软件 [rootLinux01 ~]# yum -y install qemu-kvm-tools [rootLinux01 ~]# yum -y install qemu-kvm [rootLinux01 ~]# yum -y install virt-install [rootLinux01 ~]# yum -y install qemu-img [rootLinux01 ~]#…

Oracle 日志路径查询介绍

数据库日志分析详解&#xff1a;  ORACEL RAC 体系架构分析  Oracle RAC 包含GI(Grid Infrastructure) 集群软件与Oracle数据库组成。  GI包含两个最主要的组件&#xff1a;Clusterware集群软件和ASM存储软件&#xff0c;这两个软件提供数据库高可用能力。  …

k8s之Pod的基础(上)

什么是pod&#xff1f; pod是k8s中最小的资源管理组件 pod也是最小运行容器化的应用的资源管理对象 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合 在一个pod当中运行一个容器时最常用的方式 在一个pod当中同时运行多个容器&#xff0c;在一个po…

Excel·VBA二维数组组合函数的应用实例之概率计算

看到一个视频《李永乐老师的抖音 - 骰子概率问题》&#xff0c;计算投出6个骰子恰好出现1、2、3、4、5、6这6个点数的概率 李永乐老师的计算方法是&#xff0c;第1个概率为1即6/6&#xff0c;第2个不与之前相同的概率为5/6&#xff0c;第3个同理概率为4/6&#xff0c;因此该问…

快速实现前后端表单交互(minui)

&#xff08;1&#xff09;使用minui快速生成表单 &#xff08;2&#xff09;修改样式&#xff0c;将生成的html文件发送给后端 &#xff08;3&#xff09;前后端交互&#xff08;后端如何处理不太清楚&#xff09; 表单初始化&#xff1a;新增修改&#xff08;包括查看&…

【Win】没设置Windows账户密码,如何远程登录

1、按下Win&#xff0c;输入本地&#xff0c;打开本地安全策略 2、找到这个 3、双击打开&#xff0c;改成已禁用 4、正常重新启动一次或者开关机一次永久生效。 - 我第一次弄完死机了&#xff0c;再开机发现没生效

安科瑞余压监控系统在住宅小区的应用方案——安科瑞 顾烊宇

【摘要】&#xff1a;本文分析了火灾发生时人员伤亡的主要原因——烟雾&#xff0c;并针对该原因提供切实可靠的系统应用解决方案&#xff0c;并通过具体案例&#xff0c;从设计依据、产品选型、系统组网、现场安装等方式介绍余压监控系统&#xff0c;希望可以在火灾发生时较大…

Blender:从新手到专家的全方位指南

Blender&#xff0c;这款强大的开源3D建模和渲染软件&#xff0c;已经成为了CG行业的标准工具之一。它不仅拥有丰富的教程资源&#xff0c;而且还在不断发展和完善中。尽管Blender的教程主要集中在国外网站和YouTube上&#xff0c;但其全面的功能和易用性使它成为许多人的首选工…

拉取镜像自动部署:简化部署流程的高效方法知多少?

在现代软件开发中,容器化技术已经成为了一种广泛采用的方法,它提供了可移植性、隔离性和高效资源利用等优势。在容器化环境中,镜像扮演着重要的角色,它们包含了应用程序及其依赖项。本文将介绍如何使用拉取镜像自动部署的技术,以简化部署流程。 拉取镜像自动部署的核心思想…

JNI的C语言实现字节间的转换

JNI中的C语言实现字节间转换_jni 纯c char*-CSDN博客 ASCII转 16进制数 java代码_java 16进制ascii转数字-CSDN博客 十六进制字符串转换成十进制数_16进制字符串转10进制-CSDN博客 C语言16进制与ASCII字符相互转换_C 语言_脚本之家 (jb51.net) C 常见进制转换代码 - 知乎 …

贝莱德等巨头将通过最终考验!ETF获批是涨是跌?交易数据背后的博弈信号已经显现!

还记得摩根大通&#xff08;(J.P.Morgan&#xff09;首席执行长杰米-戴蒙&#xff08;Jamie Dimon&#xff09;说「如果他是政府&#xff0c;他就会关闭比特币」&#xff0c;加密货币的唯一「真正用途是犯罪、贩毒、洗钱和避税」吗&#xff1f; 然而&#xff0c;最新消息显示&a…

Android Framework默认授予第三方APP悬浮窗权限

需求 有第三方应用启动会请求悬浮窗权限,因为代码中没有做规避,会弹出请求窗口,点击确认后还要跳到设置中进行授权确认.有点麻烦,想去掉请求窗口,默认授予悬浮窗权限给APP. 悬浮窗默认实现原理 AppOpsManager 是Google在Android4.3里面引进的应用程序操作(权限)的管…

【2024.01.03】转行小白-刷css面试题01

总结 1.margin 负值问题 margin-top 和 margin-left 负值&#xff0c;元素向上、向左移动&#xff0c;自己动margin-right 负值&#xff0c;右侧元素左移&#xff0c;自身不受影响&#xff0c;别人动margin-bottom 负值&#xff0c;下方元素上移&#xff0c;自身不受影响 &am…

Django评论系统

目录 创建评论模型 将新模型添加到管理站点 创建一个表单来提交评论和验证输入数据 显示评论总数和评论列表 创建评论表单&#xff0c;当表单成功提交时&#xff0c;显示一条成功消息 创建评论模型 blog/models.py class Comment(models.Model):post models.ForeignKe…

apollo自动录bag包脚本(包含清理)

需求 制作一个apollo自动录包脚本&#xff0c;类似行车记录仪方便出问题定位。 该脚本实现以下功能&#xff1a; 自动创建录制文件夹创建以日期为命名的文件夹录制bag包全部录制或去除点云等数据量比较大的话题进行简单录制设置bag包最大占用空间每隔一分钟自动计算该文件夹占…

php之 校验多个时间段是否重复

参考网址 https://www.kancloud.cn/xiaobaoxuetp/mywork/3069416 https://segmentfault.com/a/1190000020487996 PHP判断多个时间段是否存在跨天或重复叠加的场景 /*** PHP计算两个时间段是否有交集&#xff08;边界重叠不算&#xff09;** param string $beginTime1 开始时间…