String funStr = "((A1+(A1*A2)/SUM(A3:A5))*100+SUM(A6:A8))" ;
Matcher m1 = Pattern.compile("(SUM\\(.*?\\)+)").matcher(funStr);
while (m1.find()) {
System.out.println(m1.group());
System.out.println("----------------");
}
输出:
SUM(A3:A5))
----------------
SUM(A6:A8))
----------------
String funStr = "((A1+(A1*A2)/SUM(A3:A5))*100+SUM(A6:A8))/sum(A9:A11)" ;
Matcher m1 = Pattern.compile("(SUM\\(.*?\\)+)|(sum\\(.*?\\)+)").matcher(funStr);
输出:
SUM(A3:A5))
----------------
SUM(A6:A8))
----------------
sum(A9:A11)
----------------
注意:这里匹配出了两个右括号。
可以把加号去掉再试一下:
String excelFunRex = "(COUNT\\(.*?\\))|(ROUND\\(.*?\\))|(MIN\\(.*?\\))|(MAX\\(.*?\\))|(SUM\\(.*?\\))|(AVERAGE\\(.*?\\))" ;
String funStr = "(A1+((A1*A2)/SUM(A3:A5))*100+SUM(A6:A8)/sum(A9:A11)+MAX(a123)" ;
得到以下结果:
SUM(A6:A8)
MAX(a123)
SUM(A3:A5)
解释:
^在[]里面为取反 在外面为开头匹配
$为结尾匹配
\\d为数字(其中第一个\是转义)
+是匹配一次或者多次
?是匹配字表达式的零次或者一次
[]标记表达式开始和结束
()子表达式的开始和结束
.匹配除换行符 \n 之外的任何单字符
|指明两项之间的一个选择。要匹配 |
