在编程语言中,书本上往往爱考运算符优先级,动辄一串表达式十几个不同的运算符,难记难看。的确,优先级很重要,但是笔者总是爱使用()括号来进行限制,改变优先级,使视觉上更好的理解,这可能是比较下乘的武功吧。
而在正则表达式中,运算符或者更准确的说是元字符或者说是需要区分优先级的元字符,只有寥寥几个。所以,学习优先级,告别使用()括号是有必要的。
\ | 转义符 (优先级最高) |
---|---|
()(?:)(?=)(?!)[] | 圆括号和方括号 |
*+?{n}{n,}{n,m} | 限定符 |
^$\任何元字符 | 定位点和序列 |
| | 替换、“或”操作。字符具有高于或操作的优先级,使得z|food可以匹配z或者food。如果要匹配zood或food的要使用正则表达 式(z|f)ood (优先级最低) |
这里特别要注意到是:“或”操作元字符 | 的优先级最低,如果遇到形如^z|food$的形式它可以匹配的是“行开头z”或者是“food行结尾” 因为^和$的优先级比 | 要高,优先运算它们两个,按照正常的需求与逻辑,应该是^(z|food)$ 。
如图:
.
所以在使用“或”操作 | 时,一定要注意它优先级最低这一事实。
在同一优先级中,运算顺序是从左到右的。譬如:
^a\d{2,3}$
优先级最高的是\d和a,随后是{2,3},最后是^ 和$ 。注意:单个字符拥有和\一样的优先级。
在分析正则表达式的时候,往往的依据是“或”操作 | 。依据 | 将表达式分解成几部分。
譬如:正则表达式22[0-3]|2[0-1][0-9]|1[0-9]{2}|[1-9][0-9]?|0 (请关注|的左侧优先性)
我们依据“或”运算 | 将这个表达式分为五部分,分别是22[0-3]、2[0-1][0-9]、1[0-9]{2}、[1-9][0-9]?、0我们逐个分析。
22[0-3] 匹配220到223
2[0-1][0-9] 匹配200到219
1[0-9]{2} 匹配100到199
[1-9][0-9]? 匹配1到99
0 匹配0
综合起来就是从0到223的数字集合。所以,分析正则表达式要以|入手