正则引擎分类

有两种类型的引擎:文本导向(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/

字符模式语法\语言sedgawkjsphp
123....TRUETRUETRUETRUE
12456zzz123456.**TRUETRUETRUETRUE
123456456[0-9]++FALSETRUETRUETRUE
1234561234?567??FALSETRUETRUETRUE
123^123$^$TRUETRUETRUETRUE
12312(3|4)|FALSETRUETRUETRUE
123456456123(456)*()FALSETRUETRUETRUE
123456456[0-9]*[]TRUETRUETRUETRUE
123456456[0-9]{9}{a,b}FALSETRUETRUETRUE
123\d\dFALSEFALSETRUETRUE
123\w\wTRUETRUETRUETRUE
" "\s\sFALSEFALSETRUETRUE
123(?[0-9])分组FALSEFALSETRUETRUE
\n\n\nFALSEFALSETRUETRUE

测试工具

https://regexr.com/

  • 支持perl & js正则
  • 界面美观功能强大,

https://rubular.com/

  • ruby正则
  • 简洁强大,国内访问比较快

http://php.jsrun.net/XYXKp/edit

  • 手写代码测试正则

https://c.runoob.com/front-end/854

  • js正则
  • 有很多语法参考

http://www.pyregex.com/

  • python正则
  • 支持各种匹配模式

https://pythex.org/

  • python正则
  • 简洁强大
最后修改:2021 年 02 月 08 日
如果觉得我的文章对你有用,请随意赞赏