zwhu / blog

嘛,写 blog 也要遵守基本法。
MIT License
66 stars 2 forks source link

正则表达式中的运算符优先级和代数定律 #19

Open zwhu opened 8 years ago

zwhu commented 8 years ago

运算符优先级

  1. 一元运算符 * (克莱尼闭包)具有最高的优先级,并且是左结合的。
  2. 连接(即ab)具有次高的优先级,它也是左结合的。
  3. | (运算符并)的优先级最低,并且也是左结合的。

例如:我们可以将 (a)|((b)*(c)) 改写成a|b*c

上面是基础的正则约定,下面总结了一份常用正则表达式扩展中的优先级列表(顺序从高到低)。

优先权 符号
最高 \
()、(?:)、(?=)、[]
*、+、?、{n}、{n,}、{m,n}
^、$、(\任何元字符、任何字符)
最低

运算符代数定律

定律 描述
r s=s r 满足交换律
r (s t) = (r s) t 满足结合律
r(st) = (rs)t 连接满足结合律
r(s t) = rs rt; (s t)r = sr tr 满足分配律
ε人= rε = r ε 是单位元
r* = (r ε)* 闭包中一定有 ε
r* = r * 具有幂等性

虽然说这个表格作用不是很大,但是熟练掌握之后可以少写不少让人讨厌的小括号,也算是珍爱生命,珍爱眼睛吧。

zwhu commented 8 years ago

今天一个同事给我一个正则表达式问我为什么判断不正确

/[\\S]{1,10}/

他是写 Java 的,写了一个判断字符串长度只能在 1-10 的正则表达式,在 java 中一切都运行良好,但是在 js 中却运行错误,我当时脑袋也是一懵,想了半天才想到怎么写出正确的正则,至于错误原因,我也就懒得总结了。

/^\S{1,10}$/