2017-07-11 40 views
-3

我有這樣的字符串:Java的正則表達式平衡括號

If ({{SQL}}.Employee.Title starts with 'Production') 
and (substring of {{SQL}}.Employee.Title from '27' for '2' is not '30') 
and ({{SQL}}.Employee.HireDate is greater than or equal to '2000-01-01 00:00:00.000') 
then Pull {{SQL}}.Title, {{SQL}}.HireDate from Employee 

從這個表情,我想找出圓括號是否正確平衡或不Java語言。

一種方法是創建一個計數器變量,一旦找到左括號並在遇到右括號時將其減一,計數器變量就會增加。根據結果​​,我可以決定結果。

但是,這不會幫助像()這樣的字符串,即括號內沒有任何字母數字字符。

有什麼方法可以確定圓括號是否平衡,並且這些括號之間應該有字母數字字符。 如果括號是空的,即在打開和關閉括號之間沒有字符,它應該會引發錯誤。

+3

不要使用正則表達式,它會變得混亂。使用'Stack' – TheLostMind

+0

使用堆棧,如何識別括號內的字母數字字符。 –

+1

想一想。如果你得到一個左括號,然後將它推到堆棧上並將一個標誌設置爲true。因此,讀取的下一個元素不應該是右大括號(錯誤)。此外,所有在左大括號後面讀取的元素都應該是字母數字(請參閱https://stackoverflow.com/questions/12831719/fastest-way-to-check-a-string-is-alphanumeric-in-java) – TheLostMind

回答

1

你需要一個類似於下面的代碼。它使用堆棧跟蹤+記得什麼是最後一個字符occurence爲了跟蹤空括號打開/關閉括號的數量:

String test = "{TEST}(A){"; 

    Stack<Integer> stack = new Stack<>(); 
    boolean lastCharIsParantheses = false; 
    for (char c : test.toCharArray()) { 
     switch (c) { 
      case '{': 
      case '(': { 
       stack.push(1); 
       lastCharIsParantheses = true; 
       continue; 
      } 
      case '}': 
      case ')': 
       stack.pop(); 
       if (lastCharIsParantheses) { 
        throw new RuntimeException("Empty parantheses"); 
       } 
     } 
     lastCharIsParantheses = false; 
    } 
    if (!stack.empty()) { 
     throw new RuntimeException("Not matching number of opened/closed parantheses"); 
    } 
+1

用RunTimeException替換異常並改進開關。你也可以解釋一下這段代碼的作用嗎?參考[答案]。仍然我喜歡這個答案 – xenteros

+0

@xenteros - 謝謝,完成! –