type
status
date
slug
summary
tags
category
icon
password

正则引擎的分类

用下面这个表达式匹配,如果只能匹配nfa就是传统的NFA表达式,js是传统的NFA
如果输出的是nfa not就有可能是 DFA或者 POSIX NFA,需要用下面这个语句来判断,如果时间很久,就是POSIX NFA否则就是DFA,上一个测试已经证明jsNFA引擎了。
作者用汽油车比喻NFA,用电动汽车比喻DFA,很生动。汽油车老牌稳定,但是缺点也很多。电动车节能(表达式运行的速度更快),优缺点都有,用的人少。

正则的规则

1. 优先选择最左端的匹配结果

问:The dragging belly indicates that your cat is too fat./cat/匹配会匹配到什么?
答:结果是indicates 这个cat,因为正则是从前到后一个一个匹配的,所以会最先匹配最前面的内容。

2. 标准量词是优先匹配的

问:/^.*([0-9][0-9])/ 匹配 about 24结果是什么?
答:
  1. .*会匹配所有的内容,然后表达式看到了必须匹配的([0-9][0-9])会从后面向前释放字符。
  1. 匹配到4发现可以匹配,但是只能匹配一个[0-9]所以继续释放,匹配到了一个2结束匹配。返回结果。
问:/^.*([0-9]+)/匹配Copyright 2003结果是什么?
答:
  1. 先来先服务的原则,因为.*已经匹配到最后了,然后发现+就必须要让步1个名额,因为+的匹配下限是1
  1. 如果/^.*([0-9]*)/用这个匹配,结果就什么都匹配不到了,因为的匹配下限是0

回溯

丢面包屑做记号,每一个分岔路,都留下面包屑做记号。这条路走到尽头,回来再从有面包屑的地方,去走其他的路。
  1. 如果是匹配优先量词--正则会进行尝试,如果是忽略匹配优先量词--正则会跳过尝试。
  1. 后进先出,栈结构。面包屑相当于储存的备用状态
问:/^.*([0-9][0-9])/ 匹配 CA 95472 USA结果是什么?
答:
  1. NFA引擎是会表达式主导的,所以表达式有什么表现会影响到引擎的效率。DFA是文本主导的,所以不需要考虑表达式的写法 ,但是也不够灵活。
  1. 结果得出72是因为会匹配到最后,然后在进行回溯。因为每一步,都有留下面包屑,回到数字,发现可以匹配到,就输出最终结果。
问:The name "McDonald's" is said "makudonarudo" in Japenese.匹配引号中的McDonald's要怎么做?
答:
  1. 错误:/".*"/这样匹配到的内容是McDonald's" is said "makudonarudo因为量词会一直匹配到最后,而.是什么都会匹配的。然后进行回溯找到符合条件的返回。
  1. [^"]* 代替 .*这样做,虽然匹配的过程是一致的,但是匹配的内容不一致,因为.会什么都匹配,然后回溯。但是[^"]到不是"就停下来了,然后回溯。
  1. .*点是匹配不了\n换行符的。[^"]可以匹配\n,如果不想匹配可以使用[^"\n]
  1. /".*?"/忽略优先量词,会获取底线匹配可能性。

实战

匹配IP地址

问:如何用正则匹配ip地址 255.255.255.255
答:
  1. 分别处理了,如果01开头,2开头,25开头,后面的数字的处理,每一个都这样处理。最后得到了如下的正则表达式
  1. 用正则表达式处理起来较为复杂,所以可以正则表达式配合其他方法进行处理。根据自己的业务需求。

处理文件名

问:如何在/usr/local/bin/gcc这种文件路径中获取最后的文件名称gcc
答:利用回溯,对尾部不是/的部分进行捕获
问:如何在/usr/local/bin/gcc这种文件路径中获取最后的文件路径/usr/local/bin/
答:利用回溯,.*会一直向后获取,然后释放到/的位置
问:如何在/usr/local/bin/gcc中分别获取文件名和文件路径。
答:把上面两个表达式结合起来。分别获取$1就是路径,$2就是文件名
正则表达式(二)进阶Airpods连接电脑无法充电解决