返回 怎么学会正则表...... 登陆

怎么学会正则表达式

高洛峰 2016-10-29 16:05:48 565

其实没那么麻烦了,Sublime Text 或 类似编辑器的 『ctrl + F』 足矣,平时开发顺带练了.

1.png

记得打开左下的正则开关



其实大部分涉及到字符串模式匹配的都可以用正则解决,我大概罗列下自己的经历

1. 入门: 解决各个业务上的问题,比如邮箱、手机号等等,开始知道正则能解决什么问题,以及正则的受限性。
2. 进阶: 比如在最初写GitHub - leeluolee/puer: more than a live-reload server, built for efficient front-end development的时候, 尝试实现一个简化的router。  在这个过程中,开始会使用子匹配和特定的宿主语言API实现一些高级特性,类express的route 会支持 括号内引入子规则 ,比如 /api/blogs/:id(\d+) ,这里会有一些较复杂递归的处理,配合String.prototype.replace(首参数支持正则)可以较好的解决。在这个阶段,基本我已经可以感觉已经无需查阅任何关于正则的资料,可以自行解决不太复杂的文本模式匹配问题,初步形成了记忆。

3. 再进阶:  碰到更复杂的正则表达式的需求 我尝试了使用javascript生成正则表达式,比如在GitHub - leeluolee/nes: a small js selector lib with incredible extensibility, but still very fast 拼装了一个下面的正则,这个几乎是无法人肉维护了,必须用代码生成。

/(\s*,\s*)|(#([\w\u4e00-\u9fbf-]+))|(\*|\w+)|(\.([\w\u4e00-\u9fbf-]+))| (:([\w\u4e00-\u9fbf-]+)(?:\(([^\(\)]*|(?:\([^\)]+\)|[^\(\)]*)+)\))?)| (\[([\w\u4e00-\u9fbf-]+)(?:([*^$|~!]?=)['"]?((?:[\w\u4e00-\u9fbf-]||\s)+)['"]?)?\])|(::([\w\u4e00-\u9fbf-]+)) |([>\s+~&%](?!=))|(\s*\{\s*(\d*),(\-?\d*)\s*\}\s*)/g

后面的一些非业务项目,涉及到的更复杂场景,基本也是类似的解决方案,只不过生成的正则更加恶心。我可以列举下,比如

https://github.com/leeluolee/mcss/blob/master/lib/tokenizer.js#L199

https://github.com/regularjs/regular/blob/master/src/parser/Lexer.js#L225

后面碰到的这些问题,其实有些不算是完全的正则了,因为会与上下文相关,到这里基本上你可以有十足的把握清楚何时才去使用正则表达式。

最新手记推荐

• 用composer安装thinkphp框架的步骤 • 省市区接口说明 • 用thinkphp,后台新增栏目 • 管理员添加编辑删除 • 管理员添加编辑删除

全部回复(0)我要回复

暂无评论~
  • 取消 回复 发送
  • PHP中文网