2013-06-29 231 views
4

我想解決如何將字符串拆分成組。我不認爲split(regex)方法就足夠了。如何將一個字符串分成多個組?

我有String complexStatement = "(this && that)||(these&&those)||(me&&you)";,我希望的陣列不與這種形式:

"(this && that)","(these&&those)","(me&&you)"" 

如果我有"(5+3)*(2+5)+(9)"然後我想有「(5 + 3)」,「(2+ 5)」, 「(9)」。

(如果你能以某種方式保持加入信息,例如*,+,||加分)這是可能的任意字符串輸入?我正在玩一個StringTokenizer,但我還沒有完全掌握它。

+2

你想只保留括在圓括號內的東西嗎?嵌套圓括號怎麼樣?那麼不平衡的括號呢? –

+0

@RayToal我不確定。我想如果我可以在括號外面分開,我可以最終循環到每一個內部?還是那個天真? – Pureferret

回答

4

可以使用波紋管代碼:

String str = "(this && that)\",\"(these&&those)\",\"(me&&you)"; 
    Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)"); 
    Matcher m = pattern.matcher(str); 
    while (m.find()){ 
     System.out.println(m.group(0)); 
    } 

\\(([^\\)]+)\\)會挖你什麼括號內,看起來像你想要什麼!:

編輯:

要捕獲)(之間的內容只是用\\)([^\\(]+)\\(代替正則表達式一個!

+0

這太棒了!我試圖做一個正則表達式來匹配')(''所以它會拿起''),('和')&&('。我試過'「(?:\\(。* \\ )(。+)\\(。* \\))?「''但無濟於事。我在哪裏滑倒?而且,它看起來與1),(2), 3 ,這是爲什麼,我該如何解決它? – Pureferret

+1

@Pureferret,我編輯了我的答案,你現在就可以看到它! –

2

我認爲你最好實施解析,而不是依賴任何現成的方法。

這是我的建議...我假設輸入的格式將永遠像followig

(value1+operator+value2)+operator+(value3+operator+value4)+........ 

[這裏運營商可以是不同的,+只是顯示concatanation)。

如果上面的假設是真的,那麼你可以做以下事情。

  1. 使用堆棧
  2. 在閱讀原始字符串推動所有字符進棧
  3. 現在通過以下邏輯 一個彈出一個接一個地從堆棧。如果得到)開始添加到字符串 b。如果得到(添加到字符串,現在你會得到一個令牌,該令牌添加到陣列。 角越來越之後(跳過直到下一個)。

NB它只是與原始思維的僞代碼。

1

如果你想通過最外層的圓括號來捕獲僅限於的組,那麼你在正規表達式的世界之外,並且需要解析輸入,StinePike的方法是好的;另一個(在雜亂的僞代碼中)如下:

insides = [] 
outsides = [] 
nesting_level = 0 
string = "" 
while not done_reading_input(): 
    char = get_next_char() 
    if nesting_level > 0 or char not in ['(', ')']: 
     string += char 
    if char == '(' 
     if nesting_level == 0: 
      outsides.add(string) 
      string = "" 
     nesting_level += 1 
    elif char == ')': 
     nesting_level -= 1 
     if nesting_level == 0: 
      insides.add(string) 
      string = "" 

如果輸入中的第一個字符是'(',你會在你的outsides陣列中得到一個額外的字符串,但你可以解決這個問題,沒有太大的麻煩。

如果你對嵌套圓括號感興趣,那麼你將不會產生兩個數組作爲輸出;你需要一棵樹。

相關問題