当前位置: 首页 > Web前端 > HTML

正则化原理解析

时间:2023-03-29 12:17:31 HTML

1.什么是回溯?回溯法也称为启发式方法。它的基本思想是:从问题的某个状态(初始状态)出发,搜索从这个状态可以到达的所有“状态”,当一条路到达“结束”时间(不能继续前进)时,取退一步或多步,从另一种可能的“状态”开始,继续寻找,直到所有“路径”(状态)都试过了。这种不断地“前进”和“回溯”寻找解法的方法称为“回溯法”。如果我们的正则是/ab{1,3}c/,它的形象化形式是:当目标字符串是“abbbc”时不回溯,不存在所谓的“回溯”,匹配过程如下:如果有回溯,如果目标字符串是“abbc”,中间有回溯。匹配过程如下:图中第五步表示匹配失败。此时b{1,3}已经匹配到两个b。走到第六步的时候,发现后面有一个'c',那么就断定b{1,3}已经匹配完成,第四步回到之前的状态。这个过程称为回溯,回溯只是回溯的一种表现形式。二、JS正则化原理1.DFA-Deterministicfiniteautomaton特点:文本驱动的DFA在读取一段文本时,会记录当前表达式中所有符合匹配要求的位置,这些位置的集合对应于DFAAstate2、NFA-non-deterministicfinitestateautomaton-No-deterministicfiniteauotmaton特征:表达式从表达式的左侧开始,每次读取正则表达式的一个字符,检查当前文本是否匹配当前表达式如果是,则继续正则表达式的下一个字符。3.实例分析正则:reg=to(nite|knight|night)String:tonightDFA匹配过程:1.引擎读取文本t时,记录匹配位置to(nite|knight|night)2.读取文本o,记录位置到(nite|knight|night)3.读取文本n,记录位置到(nite|knight|night)//体现与NFA的区别...NFA匹配过程:1.得到表达式的to(nite|knight|night),扫描匹配字符串中的t2,得到表达式的to(nite|knight|night),扫描匹配字符串中的to3,括号中的表达式分为三种情况,引擎会尝试三个条件。..从例子可以看出,DFA的每一次匹配都会记录下所有符合要求的表达式位置,形成一个集合。下面匹配时,不符合要求的集合将被淘汰。每一步都是有效匹配,所以回溯不一定存在。当NFA遇到选择不确定的表达式时,会进行试探性匹配,按照分支进行匹配。如果后续没有匹配到,则返回确定位置,继续下一个分支进行匹配。回到原来位置的前提是需要记住历史状态,所以NFA有回溯。3、高级功能NFA除了支持回溯,还支持分组、捕获、零宽度断言等高级功能。这些功能的基础是NFA具有子表达式独立匹配的特点。1.分组一个或多个字符用括号括起来组成一个整体。分组分为捕获组和非捕获组。捕获组:例子(ABC)(ABCD(ABCDE)),有四个组:组内容组1(ABC)(ABCD(ABCDE))组2(ABC)组3(ABCD(ABCDE))组4(ABCDE)捕获组的应用:反向引用计数注意:反向引用只指文本内容,不是正则表达式。为什么我们通常在反向引用中使用从\1开始的组?非捕获组:以(?开头的组为非捕获组,匹配到的字符不存入内存,从而节省内存。(?:a|A)123(?:b)可以匹配a123b或A123bnon-capturing组的形式有很多种,包括零宽断言、模式修饰符等,Lookaround也叫lookaround或pre-search零宽断言,常见的零宽断言有四种:a)(?=exp):零宽度前瞻断言letreg=/(test)(?=suffix)///匹配testb)后跟后缀(?<=exp):零宽度正后向断言letreg=/(?<=prefix)(test)//匹配testc)(?!exp)withprefixinfront:zero-widthnegativelookaheadassertionletreg=/(test)(?!suffix)///匹配testd)后面没有后缀?\d{4})-(?\d{2})-(?\d{2})/letret=str.match(reg).groupsoutputresult:{year:'2021',month:'09',day:'26'}4.实战分析Input.Password密码输入组件,密码规则为四个字符中至少满足三个字符类型,如下图:将表达式中的\W替换为"()!@#$%^&*|?><"NewRegExp("^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W]+$)(?![a-z0-9]+$)(?![a-z\W]+$)(?![0-9\W]+$)[a-zA-Z0-9\W]{8,}$");