2011-12-21 23 views
2

ユーザー入力を論理式の形式(たとえば:(p =>(r || q)))で取得するプログラムがあります。括弧で囲まれた部分文字列への文字列。私はパターンとマッチャーを使用しています。
例えば、ユーザ入力:
((p || q)=> r)です。
P || Q
(P || Q)=> R:
は私がしている2つのストリングを取得したいです。だから私は、プログラムがすべてのサブストリングを見つけるという方法が必要です私は
Java Regexを使用して別の部分文字列を持つサブ文字列を見つける

Scanner scanner = new Scanner(System.in); 
System.out.println("Enter formula: "); 
String formula = scanner.next(); 
Pattern pattern = Pattern.compile("\\((.*?)\\)"); 
Matcher matcher = pattern.matcher(formula); 
     while(matcher.find()) 
     { 
      String s = matcher.group(1); 

      System.out.println(s); 
      } 

を使用していたコードを
(P || Qここ

さ:
は、しかし、私はこれだけ取得していますその文字列に。

+0

正規表現はこのタスクには適していません。手動で解析するか、解析ライブラリを使用することをお勧めします。 –

答えて

2

あなたは正規表現でこれを行うことはできません。

の使い方ため、角括弧は、あなたがしたいことが正規表現の能力を超えているという兆候です。正規表現は、ブラケット構造を持たないChomsky-3文法を記述します。ブラケット構造はChomsky-2文法で利用できます。したがって、解析ルールを使って対応する文法を定義する必要があります。あなたが望むものを達成するのに役立つ良いライブラリはANTLRです。

2

私のコメントで述べたように、正規表現はネストされた大括弧をまったく処理しません。しかし、スタックを持っていれば手動で解析するのは非常に簡単です。

public static void main(String[] args) throws InterruptedException { 
    findSubExpressions("((p||q)=>r)"); 
} 

private static void findSubExpressions(String input) { 
    Deque<Integer> startingBrackets = new LinkedList<Integer>(); 

    for (int i = 0; i < input.length(); i++) { 
     char c = input.charAt(i); 
     if (c == '(') { 
      startingBrackets.push(i); 
     } else if (c == ')') { 
      int correspondingStart = startingBrackets.pop(); 
      logSubExpression(input.substring(correspondingStart+1, i)); 
     } 
    } 
} 

private static void logSubExpression(String subExpression) { 
    System.out.println(subExpression); 
} 
関連する問題