如何掌握正则表达式这一开发利器,看这篇就够了( 三 )


3.3.3 分组分支的匹配规则是:按照分支的顺序逐个匹配 , 当前面的分支满足要求了 , 则舍弃后面的分支 。
举个简单的分支栗子 , 使用正则表达式去匹配 /abcde|abc/g 文本 abcd , 还是通过 RegexBuddy 查看执行步骤:

如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
  1. 正则引擎匹配 a 。
  2. 正则引擎匹配 b 。
  3. 正则引擎匹配 c 。
  4. 正则引擎匹配 d 。
  5. 正则引擎匹配 e , 糟糕!下一个并不是 e , 赶紧回溯!
  6. 上一个分支走不通 , 切换分支 , 第二个分支正则引擎匹配 a 。
  7. 第二个分支正则引擎匹配 b 。
  8. 第二个分支正则引擎匹配 c , 匹配成功!
由此 , 可以看出 , 分组匹配的过程 , 也是个试错的过程 , 中间是可能产生回溯的 。
4. 正则的分析与调试RegexBuddy 是个十分强大的正则表达式学习、分析及调试工具 。RegexBuddy 支持 C++、Java、JavaScript、Python 等十几种主流编程语言 。通过 RegexBuddy , 能看到正则一步步创建的过程 。结合测试文本 , 你能看到正则一步步执行匹配的过程 , 这对于理解正则回溯和对正则进行进一步优化 , 都有极大的帮助 。
4.1 安装分析调试工具可以在 RegexBuddy 的官方网站下载及获取 RegexBuddy 。
下载完后 , 一步步点击安装即可 。
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
4.2 工具界面介绍下图便是 RegexBuddy 界面的各个面板及相关功能 。
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
4.3 创建正则为了方便使用 , 可以在布局设置那里将布局设置成 Side by Side Layout 。
在正则输入区输入你的正则 regex1 , 查看 Create 面板 , 就会发现面板上显示了正则的创建过程(或者说是匹配规则) , 在 Test 面板区域输入你的测试文本 , 满足 regex1 匹配规则的部分会高亮显示 , 如下图所示 。
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
4.4 使用 RegexBuddy 的 Debug 功能选中测试文本 , 点击 debug 就可以进入 RegexBuddy 的 debug 模式 , 个人觉得这是 RegexBuddy 最强大地方 , 因为它可以让你清楚地知道你输入的正则对测试文本的匹配过程 , 执行了多少步 , 哪里发生了回溯 , 哪里需要优化 , 你都能一目了然 。
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
4.5 使用 RegexBuddy 的 Library 功能RegexBuddy 的正则库内置了很多常用正则 , 日常编码过程中需要的很多正则表达式都能在该正则库中找到 。
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
4.6 更多工具推荐
  • 正则可视化-regexper
  • 正则可视化-regulex
  • 正则在线调试
5. 正则性能优化正则是个很好用的利器 , 如果使用得当 , 如有神助 , 能省掉大量代码 。当如果使用不当 , 则是处处埋坑 。所以 , 本章节的重点就是总结如何写一个高性能的正则表达式 。
5.1 避免量词嵌套举个简单的例子对比:
我们使用正则表达式/a*b/去匹配字符串 aaaaa , 看下图 RegexBuddy 的执行过程:
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
我们将以上正则修改成/(a*)*b/去匹配字符串 aaaaa , 再看看 RegexBuddy 的执行结果过程:
如何掌握正则表达式这一开发利器,看这篇就够了

文章插图
 
以上两个正则的基本执行步骤可以简单认为是:
  1. 贪婪匹配
  2. 回溯
  3. 直至发现匹配失败
但令人惊奇的是 , 第一个正则的从开始匹配到匹配失败这个过程只有 14 步 。而第二个正则却有 128 步之多 。可想而知 , 嵌套量词会大大增加正则的执行过程 。因为这其中进行了两层回溯 , 这个执行步骤增加的过程就如同算法复杂度从 O(n)上升到 O(n^2)的过程一般 。
所以 , 面对量词嵌套 , 我们需作出适当的转化消除这些嵌套:


推荐阅读