Javascript 正则表达式零宽断言

2024-01-04 00:04

本文主要是介绍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。

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

这篇关于Javascript 正则表达式零宽断言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567507

相关文章

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.