2017-07-11 10 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言語で適切にバランスしているか否かを知りたいです。

1つの方法は、開き角括弧が見つかるとすぐにインクリメントされるカウンタ変数を作成し、閉じ括弧に遭遇するとそれを減らすことです。その結果に基づいて結果を決定することができます。

しかし、これは括弧の間にアルファベットの数字がないような()のような文字列の場合は役に立ちません。

丸括弧が平衡しているかどうかを確認する方法はありますか?また、これらの括弧の間にアルファベット文字を入れる必要がありますか。 角括弧が空の場合、つまり開閉記号の間に文字がない場合は、エラーが発生します。

+3

を、それが厄介になり、正規表現を使用しないでください:それは、空の括弧を追跡するために、最後の文字の出現だったか覚えて+クローズ/オープンし括弧の数を追跡するためにスタックを使用して行います。 Stackを使用する – TheLostMind

+0

スタックを使用すると、大カッコ内にアルファベット文字があることをどのようにして識別できますか? –

+1

それについて考えてみてください。オープニングブラケットを取得したら、スタックに押し込んでフラグをtrueに設定します。したがって、読み込まれる次の要素は、閉じ括弧(エラー)であってはなりません。また、開きブレースの後に読み込まれるすべての要素は英数字である必要があります(https://stackoverflow.com/questions/12831719/fastestway-to-check-a-string-is-alphanumeric-in-javaを参照) – TheLostMind

答えて

1

次のようなコードが必要です。

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

ExceptionをRunTimeExceptionに置き換え、スイッチを改善してください。また、このコードが何をしているか説明してください。 [回答]を参照してください。まだ私はこの答えが好きです – xenteros

+0

@xenteros - ありがとう、やった! –