我正在尝试从Excel公式中提取列名,但我可以使用以下代码获取的是最新名称:
String formula = "IF(AB13=0,0,IF(+I13/AC13>100%,100%,+I13/AC13))";
Matcher matcher = Pattern.compile(".*\\W([A-Z]+)\\d+.*").matcher(formula);
while (matcher.find()) {
System.out.println("Column name= "+matcher.group(1));
}
我希望它能显示
"Column name= AB"
"Column name= I"
"Column name= AC"
"Column name= I"
"Column name= AC"
但它只显示“列名= AC”。
我得到的事实是我的模式的第一个“。*”与formula => IF(AB13=0,0,IF(+I13/AC13>100%,100%,+I13
的整个第一部分相匹配,但我不知道如何让它与所有可能性相匹配。
提前感谢您的帮助。
答案 0 :(得分:0)
只需删除所有.*
即可,除非您在公式中也获得该格式的文字,否则您不需要\\W
(在这种情况下,您必须全部删除在应用正则表达式之前引号内的东西):
String formula = "IF(AB13=0,0,IF(+I13/AC13>100%,100%,+I13/AC13))";
Matcher matcher = Pattern.compile("([A-Z]+)\\d+").matcher(formula);
while (matcher.find()) {
System.out.println("Column name= "+matcher.group(1));
}
.*
正在消耗所有其他匹配项,而且您并不需要将整个公式与模式/匹配器匹配。
答案 1 :(得分:0)
你太复杂了。您只想匹配一个或多个字母并声明它后跟一个数字:
[A-Za-z]++(?=\\d+)
模式的第一部分与一个或多个A-Za-z
匹配,然后使用正向前瞻来断言此模式后跟一个数字。
示例:
public static void main(String[] args) throws Exception {
String formula = "IF(AB13=0,0,IF(+I13/AC13>100%,100%,+I13/AC13))";
Matcher matcher = Pattern.compile("[A-Za-z]++(?=\\d+)").matcher(formula);
while (matcher.find()) {
System.out.println("Column name= " + matcher.group());
}
}
输出:
Column name= AB
Column name= I
Column name= AC
Column name= I
Column name= AC