引言
最近对^与$和(?: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