正则表达式的原理和个人经验-阿里云开发者社区

开发者社区> 科技小先锋> 正文

正则表达式的原理和个人经验

简介:
+关注继续查看

正则表达式是程序员非常常用的工具,利用它对数据进行查找和抽取非常高效和方便,所以很有必要对其有较为深入的了解。

  正则使用的时候一定要注意他的自动机特性,具体来说就是每个节点只会关注他下一个输入让他达到的状态。有个比较经典的trap,用正则a*?b去匹配aab,粗看一下肯定以为匹配结果会是ab,其实不然。他先去匹配第一个a,然后去判断下一个是不是b,如果不是,那么再看是不是还是a,所以结果是aab。

  正则表达式有NFA和DFA两种实现,相比较而言,DFA的效率更高,而NFA的实现比较简单且空间占用比较小。不管哪种实现,其实功能上都没有什么区别,但需要注意的是不同的正则表达式的具体实现上可能会不一样,比如用java写的正则在grep下就不一定适用,其实就是较为复杂的正则可能会出问题。具体的原理可以看一下之前转的文章http://passover.blog.51cto.com/2431658/425536

  另外使用的时候有几个经验:

1. 对任意字符进行匹配,可以使用[\s\S],这个是比较常用的习惯,虽然你还能写出很多其他一样功能的正则。

2. 利用环视来查看匹配结果的前后特征。这个在抽取且不用group的时候会经常用到,这个最好是要知道怎么用。

3. 去除不需要的group。这个经常会在写取固定的group值的时候会遇到这个麻烦,前面有个匹配不得不用到括号,这样会比预期多出来一个group,那么可以使用(?:xxx)来声明这个括号不是一个group。

4. 性能问题。其实我个人并不太关注正则表达式的优化,但是有一点是必须要注意的,就是不要使用贪婪的嵌套,这个性能是很低的。

5. 用使用正则一样的环境来验证正则,比如java的程序需要调用正则,用写个java测试程序来验证。我做过一个简单java正则验证的GUI工具,用了很多年还挺顺手的,放到附件中给大家分享一下吧。

  总的来说,使用正则不要硬搬,关键是掌握原理、灵活运用。希望大家都能把正则用的得心应手。




本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/524268,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9489 0
String.replaceAll() 正则表达式
最近项目中出现了一个正则表达式的BUG! 我用的是String.replaceAll()方法 查询发现它应该是调用了Matcher.replaceAll(),String.replaceAll()与下面这段代码等价 Pattern .
1126 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13172 0
使用DreamWeaver正则表达式修改函数参数
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zergskj/article/details/1444262 唉,真不好意思,内容似乎被谁替换过了.
534 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载