有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用模式从Excel公式中提取列名

我试图从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"

但它只显示“Column name=AC”

{cd1}我不知道我的第一部分是如何匹配的

提前感谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    你把事情搞得太复杂了。您只需匹配一个或多个字母,并声明后面跟一个数字:

    [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
    
  2. # 2 楼答案

    只需删除所有的.*,您就不需要\\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

    .*消耗了所有其他匹配项,而且您实际上不需要使用pattern/matcher匹配整个公式