高校网站如何建设论文,asp.net网站开发简介,上海网站建设推,php网站建设教程视频在介绍正则表达式零宽断言这个概念之前#xff0c;先看一下以下这道有关 javascript 正则表达式的题目#xff1a;
登录注册流程是前端最常见的业务流程之一#xff0c;注册流程少不了密码强弱度校验#xff0c;请实现对密码的校验#xff0c;要求满足#xff1a; 包含大…在介绍正则表达式零宽断言这个概念之前先看一下以下这道有关 javascript 正则表达式的题目
登录注册流程是前端最常见的业务流程之一注册流程少不了密码强弱度校验请实现对密码的校验要求满足 包含大小写字母、数字、特殊字符中的至少任意两种长度8-32位。
什么是零宽断言
零宽断言 匹配字符串而不消耗任何内容。ECMAScript 具有向前执行此操作的前向断言但该语言缺少向后执行断言所提供的向后执行此操作的方法。通过 lookbehind 断言人们可以确保一个模式是否在另一个模式之前例如匹配美元金额而不捕获美元符号。零宽断言是正则表达式中的难点所以本章节重点从匹配原理方面进行一下分析。零宽断言还有其他的名称例如环视或者预搜索等等。
匹配字符串而不消耗任何内容这句话怎么理解来看以下两个例子
正则匹配abc后面的大写字母
const strabcDEF;
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
使用正向肯定预查匹配abc后面的大写字母
const strabcDEF;
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。
如果你有闲暇时间可以做个知识拓展。 看完本文如果觉得有用记得点个赞支持收藏起来说不定哪天就用上啦