正则表达式:^与$的深刻理解,(?:pattern)与(?=pattern)的区别

引言

最近对^与$和(?:pattern)与(?=pattern)的区别有了更新的理解,首先举出一个例子:对于一个带小括号的算式(如,1+2*(2+3)),现在有一个现成的静态方法calculateFormula(String formala),该方法可以实现:输入任意一个不带小括号的普通四则算式,返回计算结果。

考虑到运算的优先级,我们需要先计算子算式2+3,通过calculateFormula(String formala)得到计算结果5,最后将原算式1+2*(2+3)中的子算式2+3替换为5,得到一个不带括号的算式1+2*5,最后再调用calculateFormula(String formala)得到最终的结果。

要完成上述的例子,最重要的两点是:

  1. 获取被小括号括起来的子式 2+3(注意是不带括号的内容)
  2. 1+2*(2+3)中的 (2+3)(注意是带括号的内容)替换为5

下面我们通过尝试通过正则表达式来获取到2+3

通过正则表达式获取小括号内的子算式 ——(?=pattern)的使用

要获取1+2*(2+3)中的2+3,你要匹配到算式内被()括起来的字符部分,并且要除去()
用到的表达式为:(?<=\\()[^\\(\\)]*(?=\\))

(?<=\\()代表定位到符号为(的后一个位置,注意这里是定位!!!而不是匹配。

[^\\(\\)]*代表匹配0个或多个不是()的字符,这里是为了避免出现嵌套的情况,如,((2+3)+1)+1 ,此时不会匹配到字符 ((2+3)+1),而只会匹配到(2+3),保证算式是不包含小括号的。

(?=\\))代表定位到符号为)的前一个位置

(?:pattern)与(?=pattern)的区别

(?:pattern)得到的匹配结果包含pattern

(?+pattern)得到的匹配结果不包含pattern

就最终的匹配效果而言(?:pattern)(pattern)没有任何区别:

  • 各正则表达式的匹配结果

匹配结果一.png

匹配结果二.png

匹配结果三.png

^与$在字符匹配时的意义

对于例子:1+2*(2+3),有以下情况:

  1. 使用了^和$符号的正则表达式用于全局的字符匹配,即对”1+2*(2+3)的内容整个进行匹配
  2. 带^符号的正则表达式,是对头部为原字符串的子串,对于上述例子即是对1,1+2,1+2*…等子串进行匹配
  3. 带$符号的正则表达式,是对尾部为原字符串的子串,对于上述例子即是对),3),+3)…等子串进行匹配
  4. 不带^和$符号的正则表达式,则是对任意子字符进行匹配
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享