2014-12-04 118 views
1

之間解析字符串元素我試圖寫一個小程序,它從嵌套的括號之間提取信息。例如,如果我給出的字符串:嵌套的括號

"content (content1 (content2, content3) content4 (content5 (content6, content7))"

我想這將返回(在一個ArrayList或其他集合):

["content", "content1", "content2, content3", "content4", "content5", "content6, content7"] 

是否有任何現有的庫或一個算法,我可以用這個來幫助我。

在此先感謝!因爲它們是相同的括號內

編輯

感謝您的建議不過內容2和content3應保存在同一個字符串中的最終名單。

+0

所以你不要對括號關心呢? – isnot2bad 2014-12-04 01:49:36

+0

這個正則表達式似乎做你想要什麼:['\ w +(?:\ S * \ w +)*'](http://ideone.com/nm7eZj) – August 2014-12-04 01:51:08

+0

不,我不這樣做,排序,其中它們的內容出現在括號內的事項,一旦我弄清楚如何 – Dylan 2014-12-04 01:51:08

回答

1

這似乎符合上面給出的一個例子:

import java.util.ArrayList; 

public class ParseParenthesizedString { 
    public enum States { STARTING, TOKEN, BETWEEN } 
    public static void main(String[] args) 
    { 
     ParseParenthesizedString theApp = new ParseParenthesizedString(); 
     theApp.Answer(); 
    } 

    public void Answer() 
    { 
     String theString = 
      "content (content1 (content2, content3) content4 (content5 (content6, content7))"; 
     // wants: 
     // ["content", "content1", "content2, content3", "content4", "content5", "content6, content7"] 
     States state = States.STARTING; 
     ArrayList<String> theStrings = new ArrayList<String>(); 
     StringBuffer temp = new StringBuffer(""); 

     for (int i = 0; i < theString.length() ; i++) 
     { 
      char cTemp = theString.charAt(i); 
      switch (cTemp) 
      { 
       case '(': 
       { 
        if (state == States.STARTING) state = States.BETWEEN; 
        else if (state == States.BETWEEN) {} 
        else if (state == States.TOKEN) 
        { 
         state = States.BETWEEN; 
         theStrings.add(temp.toString().trim()); 
         temp.delete(0,temp.length()); 
        } 
        break; 
       } 
       case ')': 
       { 
        if (state == States.STARTING) 
        { /* this is an error */ } 
        else if (state == States.TOKEN) 
        { 
         theStrings.add(temp.toString().trim()); 
         temp.delete(0,temp.length()); 
         state = States.BETWEEN; 
        } 
        else if (state == States.BETWEEN) {} 
        break; 
       } 
       default: 
       { 
        state = States.TOKEN; 
        temp.append(cTemp); 
       } 
      } 
     } 

     PrintArrayList(theStrings); 
    } 
    public static void PrintArrayList(ArrayList<String> theList) 
    {  
     System.out.println("The ArrayList with " 
       + theList.size() + " elements:"); 
     for (int i = 0; i < theList.size(); i++) 
     { 
      System.out.println(i + ":" + theList.get(i)); 
     } 
    } 
} 

輸出:

The ArrayList with 6 elements: 
0:content 
1:content1 
2:content2, content3 
3:content4 
4:content5 
5:content6, content7 
+0

很酷。你碰巧知道功能程序(特定的Clojure)嗎?由於功能程序中沒有狀態,你如何保持狀態?我試圖遞歸解析'('被發現,但是當我退出遞歸堆棧(當')'被找到時),我回到了第一個'(' – user3758745 2015-11-16 03:03:45

-1

如果括號是不是對你很重要(這意味着結果不依賴於包圍)然後String.split用一個簡單的正則表達式可以做:

String[] result = input.split("[ ,()]+"); 
+0

@八月爲什麼?輸入序列沒有任何特殊字符,OP也沒有提及它們。正則表達式對於給定的例子和類似的例子工作得很好。 – isnot2bad 2014-12-04 15:09:09

+0

這將拆分OP不需要的'content2,content3'。 – August 2014-12-04 17:43:33

+0

@八月嗯,沒錯。沒有注意到這兩個沒有分裂。 – isnot2bad 2014-12-06 12:14:03

0

Java的String.split()將做的工作爲您。它需要一個正則表達式來定義每個令牌之間的分隔符......對於你來說,它似乎是你的分隔符是括號或逗號,可選地被任何一邊的空白包圍。因此,這應該做的伎倆:

String[] result = s.split("\\s*[\\(\\),]+\\s*"); 
+0

這可以工作,但它將content2從contents3和content6中分離出來。這些對應該是同一個結果字符串的一部分。 – Dylan 2014-12-04 02:19:40

+0

@TAD從該字符串中刪除逗號,它應該可以工作。 – VGR 2014-12-04 12:22:28