《精通正则表达式》笔记二

0x00 正则表达式进阶特性

环视:用于匹配某个位置,且不占用匹配位置,例如 /(?=jeffrey)jeff/ 匹配jeffrey中的jeff,即(?=….)先找到匹配子式的起始位置,不占用子式的位置,再由后面的子式来从该位置匹配,类似的有:

字符组简记法:\d 数字[0-9] \D非数字[^0-9] \w字母加数字[0-9a-zA-Z] \W非字母数字 \s空白字符(包括换行) \S非空白字符

贪婪与非贪婪:即+*两个量词匹配时占用位置最大还是最小,涉及到量词是优先匹配还是优先忽略,不论哪一种种模式,如果匹配结果唯一时,两种模式都能给出唯一结果,否则不同,例如 /x.*x/ 对于x123x123x匹配的是整个(默认贪婪)而 /x.*?x/匹配的是x123x

占有优先:对于量词,存在两种情况,即忽略或者匹配,这两种情况的的优先级不同导致了贪婪和非贪婪模式,然而不论贪婪还是非贪婪,nfa模式下都是可以回溯的,即后面的表达式如果匹配失败,会对当前量词的另一种情况进行回溯,而使用占有优先,则一旦当前量词对应的子式能够匹配上,就不再回溯.例如 /(\d\d[1-4]?)\d+/ 我们希望如果第三个数字在1-4那么必须要有第四个数字才能匹配上而不是第三个数字被忽略,进而成为第四个\d+匹配的结果,此时这里就要用占有优先 /(\d\d[1-4]?+)\d+/ 对于1234前者后者均能匹配,对于123,前者能够匹配,后者不能够匹配,原因是3已经被[1-4]?+占有了,即使\d+匹配失败了,也不会回溯

捕获:使用()来从字符串提取数据,提取()对应子表达式匹配的字符串,如果想将()变成非捕获型,即单纯当作子表达式分割符,而不用记录对应匹配的字符串,则可以使用(?:….)

匹配模式:通过添加参数,使用不区分大小写,强化锚点等模式,对正则进行微调

​ 还有其他特性,但使用较少,此处略过,下一章开始研究正则工作原理,并打造自己的简易正则库