使用Pattern从Excel公式中提取列名称

时间:2014-01-03 12:03:25

标签: java regex excel formula

我正在尝试从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的整个第一部分相匹配,但我不知道如何让它与所有可能性相匹配。

提前感谢您的帮助。

2 个答案:

答案 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));
}

ideone demo

.*正在消耗所有其他匹配项,而且您并不需要将整个公式与模式/匹配器匹配。

答案 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