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 之外的任何單字符
|指明兩項之間的一個選擇。要匹配 |