正则表达式的顺序优先级
2016-04-08 10:20
507 查看
前言
假设存在匹配示例:匹配a-c@或a@你认为正则a|(a-c)(?=\W)与(a-c)|a(?=\W)都能匹配上面的示例吗?这2个正则有什么本质区别?哪一个才是正确的写法?--这就涉及了正则表达式的顺序优先级,本文将解释这一点。
什么是正则表达式的顺序优先级呢?在正则表达式中,| 前后的表达式的顺序是有讲究的,如expression1|expression2和expression2|expression1匹配的结果或许存在不同,在编辑正则表达式时要有这样意识,否则编辑出的正则可能不符需求。
举例说明
示例1源字符串:
a-c@
a@
正则表达式:
a|(a-c)(?=\W)
(a-c)|a(?=\W)
匹配结果:a|(a-c)(?=\W)能够匹配a@,但不能匹配a-c@;(a-c)|a(?=\W)则都可以匹配。
原因:(a-c)|a(?=\W)先匹配a-c这个整体,如果匹配失败则进行回溯,尝试匹配a,所以@前的a-c或a都是可匹配的;a|(a-c)(?=\W)能够匹配a@自不必说,但为什么不能匹配a-c@呢?因为它先匹配a,剩下-c@,-匹配(?=\W)成功,整个正则匹配成功,匹配结果为:a
示例2
源字符串:
1
01
11
正则表达式:
(0?[123456789]|(1[012]))
((1[012])|0?[123456789])
匹配结果:(0?[123456789]|(1[012]))可匹配1与01,不可匹配11;((1[012])|0?[123456789])可匹配所有的源字符串。
原因:同示例1。
小结
如本文开头所问,a|(a-c)(?=\W)与(a-c)|a(?=\W)的本质区别--后者的匹配广度高于前者,所以(a-c)|a(?=\W)才是符合需求的。相关文章推荐
- java反射机制
- 查看、分析memcached使用状态
- 据廖雪峰python3教程----python学习第九天
- iOS集成环信SDK点击聊天图片无效问题
- Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory
- hibernate多对多关系配置--增删改查
- ubuntu解压命令全览(rar)
- UI 常用(UIButton)
- 亿级Web系统的容错性建设实践(转)
- [cocos2dx笔记017]cocos2dx 2.2.6 lua的类型转换
- C++ 如何判断姓名字符串符合百家姓
- jni打印int型log
- python调用fortran模块
- oracle中varchar和varchar2区别
- iOS开发点滴 - 关闭键盘
- Hadoop集群_Hadoop安装配置
- sevlert配置错误
- shell笔记
- 内核同步机制
- Linux lsattr --显示档案隐藏属性