按excel条件拆分

时间:2014-06-18 09:23:42

标签: java regex

我想分割这个字符串:

=IF(BI18=0;INT(YEAR(TODAY()));IF(INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18))))

[IF, BI18=0, INTYEARTODAY, IF, INTYEARBI18>2025,  2025, INTYEARBI18]

我试用了那个正则表达式:

String[] result = text.substring(1, text.length()).split("[;()]+");

然而,我得到了:

[IF, BI18=0, INT, YEAR, TODAY, IF, INT, YEAR, BI18, >2025, 2025, INT, YEAR, BI18]

我正在努力确定一般的excel方法。

我很感激你的答案,按照预期将字符串分开。

3 个答案:

答案 0 :(得分:1)

你可以使用这个正则表达式。在demo中,请务必查看右侧的捕获组。

^=([^(]+)\(|\G([^;]+)[;|)$]

我们从捕获组1和2中检索匹配。

在Java中,这意味着:

Pattern regex = Pattern.compile("^=([^(]+)\\(|\\G([^;]+)[;|)$]");
Matcher regexMatcher = regex.matcher(your_original_string);
while (regexMatcher.find()) {
  // check Group 1, which is regexMatcher.group(1)
  // check Group 2, which is regexMatcher.group(2)
  }

答案 1 :(得分:1)

跟进评论,如果您想要IF(...)条件的主要内容...是内容,这里是一个快速解决方案。

请注意,尽管此解决方案适用于手头的输入,但在其他情况下,使用嵌套语句可能不可靠 - 基本上它是一种解决方法。

String formula = "=IF(BI18=0;INT(YEAR(TODAY()));IF(INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18))))";
//                            | positive lookbehind: starts with "IF("
//                            |        | any character, reluctantly quantified
//                            |        |  | positive lookahead, followed by 
//                            |        |  | ")", then...
//                            |        |  |     | ";" or end of input
//                            |        |  |     | 
Pattern p = Pattern.compile("(?<=IF\\().+?(?=\\)(;|$))");
Matcher m = p.matcher(formula);
while (m.find()) {
    System.out.println(m.group());
}

<强>输出

BI18=0;INT(YEAR(TODAY())
INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18)))

答案 2 :(得分:1)

尝试,

String str1 = "=IF(BI18=0;INT(YEAR(TODAY()));IF(INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18))))";

ArrayList<String> strList = new ArrayList<String>();

for(String str2 : str1.replaceFirst("=", "").split(";")){
    if(str2.contains("IF")){
        strList.add("IF");
        strList.add(str2.replaceAll("IF|\\(|\\)", ""));
    }else{
        strList.add(str2.replaceAll("\\(|\\)", ""));
    }   
}

System.out.println(strList.toString());

输出:

[IF, BI18=0, INTYEARTODAY, IF, INTYEARBI18>2025, 2025, INTYEARBI18]