type
status
date
slug
summary
tags
category
icon
password
正则引擎的分类
用下面这个表达式匹配,如果只能匹配
nfa
就是传统的NFA
表达式,js是传统的NFA
。如果输出的是
nfa not
就有可能是 DFA
或者 POSIX NFA
,需要用下面这个语句来判断,如果时间很久,就是POSIX NFA
否则就是DFA
,上一个测试已经证明js
是NFA
引擎了。作者用汽油车比喻
NFA
,用电动汽车比喻DFA
,很生动。汽油车老牌稳定,但是缺点也很多。电动车节能(表达式运行的速度更快),优缺点都有,用的人少。正则的规则
1. 优先选择最左端的匹配结果
问:
The dragging belly indicates that your cat is too fat.
用/cat/
匹配会匹配到什么?答:结果是
indi
cat
es
这个cat
,因为正则是从前到后一个一个匹配的,所以会最先匹配最前面的内容。2. 标准量词是优先匹配的
问:
/^.*([0-9][0-9])/
匹配 about 24
结果是什么?答:
.*
会匹配所有的内容,然后表达式看到了必须匹配的([0-9][0-9])
会从后面向前释放字符。
- 匹配到
4
发现可以匹配,但是只能匹配一个[0-9]
所以继续释放,匹配到了一个2
结束匹配。返回结果。
问:
/^.*([0-9]+)/
匹配Copyright 2003
结果是什么?答:
- 先来先服务的原则,因为
.*
已经匹配到最后了,然后发现+
就必须要让步1
个名额,因为+
的匹配下限是1
- 如果
/^.*([0-9]*)/
用这个匹配,结果就什么都匹配不到了,因为的匹配下限是
0
回溯
丢面包屑做记号,每一个分岔路,都留下面包屑做记号。这条路走到尽头,回来再从有面包屑的地方,去走其他的路。
- 如果是匹配优先量词--正则会进行尝试,如果是忽略匹配优先量词--正则会跳过尝试。
- 后进先出,栈结构。面包屑相当于储存的备用状态
问:
/^.*([0-9][0-9])/
匹配 CA 95472 USA
结果是什么?答:
NFA
引擎是会表达式主导的,所以表达式有什么表现会影响到引擎的效率。DFA
是文本主导的,所以不需要考虑表达式的写法 ,但是也不够灵活。
- 结果得出
72
是因为会匹配到最后,然后在进行回溯。因为每一步,都有留下面包屑,回到数字,发现可以匹配到,就输出最终结果。
问:
The name "McDonald's" is said "makudonarudo" in Japenese.
匹配引号中的McDonald's
要怎么做?答:
- 错误:
/".*"/
这样匹配到的内容是McDonald's" is said "makudonarudo
因为量词会一直匹配到最后,而
.
是什么都会匹配的。然后进行回溯找到符合条件的返回。
- 用
[^"]*
代替.*
这样做,虽然匹配的过程是一致的,但是匹配的内容不一致,因为.
会什么都匹配,然后回溯。但是[^"]
到不是"
就停下来了,然后回溯。
.*
点是匹配不了\n
换行符的。[^"]
可以匹配\n
,如果不想匹配可以使用[^"\n]
/".*?"/
忽略优先量词,会获取底线匹配可能性。
实战
匹配IP地址
问:如何用正则匹配ip地址 255.255.255.255
答:
- 分别处理了,如果01开头,2开头,25开头,后面的数字的处理,每一个都这样处理。最后得到了如下的正则表达式
- 用正则表达式处理起来较为复杂,所以可以正则表达式配合其他方法进行处理。根据自己的业务需求。
处理文件名
问:如何在
/usr/local/bin/gcc
这种文件路径中获取最后的文件名称gcc
。答:利用回溯,对尾部不是
/
的部分进行捕获问:如何在
/usr/local/bin/gcc
这种文件路径中获取最后的文件路径/usr/local/bin/
。答:利用回溯,
.*
会一直向后获取,然后释放到/
的位置问:如何在
/usr/local/bin/gcc
中分别获取文件名和文件路径。答:把上面两个表达式结合起来。分别获取
$1
就是路径,$2
就是文件名- 作者:yingwinwin
- 链接:https://yingwinwin.top/article/c5e8600b-6cbd-422f-9be5-eff0f851e9ca
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章