正则引擎分类
有两种类型的引擎:文本导向(text-directed)的引擎和正则导向(regex-directed)的引擎。Jeffrey Friedl把他们称作DFA和NFA引擎。这是一些非常有用的特性,如“惰性”量词(lazy quantifiers)和反向引用(backreferences),只能在正则导向的引擎中实现。所以毫不意外这种引擎是目前最流行的引擎。
你可以轻易分辨出所使用的引擎是文本导向还是正则导向。如果反向引用或“惰性”量词被实现,则可以肯定你使用的引擎是正则导向的。你可以作如下测试:将正则表达式<<regex|regex not>>应用到字符串“regex not”。如果匹配的结果是regex,则引擎是正则导向的。如果结果是regex not,则是文本导向的。因为正则导向的引擎是“猴急”的,它会很急切的进行表功,报告它找到的第一个匹配 。
- 正则导向的引擎总是返回最左边的匹配
这是需要你理解的很重要的一点:即使以后有可能发现一个“更好”的匹配,正则导向的引擎也总是返回最左边的匹配。
正则语法字符
语法中可能会用到的字符为: ^$.,*+?()[]{}<>\|
这其中,只有 ,{}<>
可以不转义,其他字符必须在前面使用\
进行转义,才能匹配自身字符。
但是,如果你想匹配{1}
或者{1,2}
,用他自身就不能匹配,因为命中了正则的格式规则,他们有如下规律。
语言 | 正则模式 | 目标字符串 | 匹配结果 |
---|---|---|---|
js | {1} | {1} | 报错 |
js | \{1} | {1} | true |
js | \{1\} | {1} | true |
js | {} | {} | true |
js | {a} | {a} | true |
js | {\d} | {1} | true |
js | {1,2} | {1,2} | 报错 |
js | {\d,2} | {1,2} | true |
发现,只要模式中没有特殊语法,{}
是不需要转义的,当他没有闭合,或者其中的字符不是数字或者数字区间。其他语言没有测试,感兴趣的自己测试吧。
特殊用法支持情况
写了一部分,并不全,其他正则环境自己测试,用自己写的小工具测试的,暂时挺好用https://tools.moozik.cn/
字符 | 模式 | 语法\语言 | sed | gawk | js | php |
---|---|---|---|---|---|---|
123 | ... | . | TRUE | TRUE | TRUE | TRUE |
12456zzz | 123456.* | * | TRUE | TRUE | TRUE | TRUE |
123456456 | [0-9]+ | + | FALSE | TRUE | TRUE | TRUE |
123456 | 1234?567? | ? | FALSE | TRUE | TRUE | TRUE |
123 | ^123$ | ^$ | TRUE | TRUE | TRUE | TRUE |
123 | 12(3|4) | | | FALSE | TRUE | TRUE | TRUE |
123456456 | 123(456)* | () | FALSE | TRUE | TRUE | TRUE |
123456456 | [0-9]* | [] | TRUE | TRUE | TRUE | TRUE |
123456456 | [0-9]{9} | {a,b} | FALSE | TRUE | TRUE | TRUE |
123 | \d | \d | FALSE | FALSE | TRUE | TRUE |
123 | \w | \w | TRUE | TRUE | TRUE | TRUE |
" " | \s | \s | FALSE | FALSE | TRUE | TRUE |
123 | (? | 分组 | FALSE | FALSE | TRUE | TRUE |
\n | \n | \n | FALSE | FALSE | TRUE | TRUE |
测试工具
- 支持perl & js正则
- 界面美观功能强大,
- ruby正则
- 简洁强大,国内访问比较快
http://php.jsrun.net/XYXKp/edit
- 手写代码测试正则
https://c.runoob.com/front-end/854
- js正则
- 有很多语法参考
- python正则
- 支持各种匹配模式
- python正则
- 简洁强大
2 条评论
路过踩踩hh
整理的不好见笑了