2014-06-18 60 views
0

我想拆分此字符串:分割用Excel條件

=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方法。

我將不勝感激您的答案,一般按預期分割字符串。

+0

實際上,你要分析與嵌套表達式語言,這無異於以多種方式解析標記。正則表達式不是正確的工具。你應該考慮實現你自己的解析器。 – Mena

+0

@Mena Yep肯定會爲此定義一個函數。然而,有沒有一種可能的方式來擺脫這個字符串的條件? – mrquad

+0

正則表達式很棘手,因爲您在括號中查看嵌套語句。我會寫一個答案,以獲得IF(...)條件的主要內容。 – Mena

回答

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))) 
+0

哇你的答案!據我所知,你基本上在聲明中跟蹤括號。如果你跟蹤括號,我不能想到這是不可能的情況。對不可能的情況有何建議? – mrquad

+2

@不用客氣。這不可行的情況將包括任何嵌套或格式不正確的括號。這與正則表達式與標記相同的限制。 – Mena

+0

Thx爲您的答覆!事情是我得到這個Excel公式不破,所以他們不能畸形。但是,我認爲其中的一些可以嵌套,所以你的意思是嵌套括號。像這樣:'AND(ROUND($ GX18-SUM(0)/ $ M $ 12; 2)<= 0; $ AK $ 7 = 1)' – mrquad

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

嘗試,

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]