引言
最近对^与$和(?: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)得到最终的结果。
要完成上述的例子,最重要的两点是:
- 获取被小括号括起来的子式
2+3(注意是不带括号的内容) - 将
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)没有任何区别:
- 各正则表达式的匹配结果



^与$在字符匹配时的意义
对于例子:1+2*(2+3),有以下情况:
- 使用了^和$符号的正则表达式用于全局的字符匹配,即对”
1+2*(2+3)的内容整个进行匹配 - 带^符号的正则表达式,是对头部为原字符串的子串,对于上述例子即是对
1,1+2,1+2*…等子串进行匹配 - 带$符号的正则表达式,是对尾部为原字符串的子串,对于上述例子即是对
),3),+3)…等子串进行匹配 - 不带^和$符号的正则表达式,则是对任意子字符进行匹配
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)