2016-05-10 33 views
0

私はJavaを使用しています。入力が(NP (PRP I))のときは、出力がPRP Iのコードを実装したいと思います。正規表現でネストされた括弧を得る方法

Pattern pattern = Pattern.compile("\\((.?)\\)"); 
Matcher matcher = pattern.matcher(noun_phrase); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

その出力はNP (PRP Iです: 私の現在の実装では、次のようなものです。

括弧を数えることが1つの可能性を知っていますが、regexを使用してネストされた括弧内の文字列を取得する方法があるかどうかは疑問です。

+0

最内層だけが必要な場合は、 '\\(([^()] *)\\)'を試してください。 [regex101](https://regex101.com/r/hO4bN7/1)をチェックしてください。 – ClasG

+0

Javaの正規表現は、再帰をサポートしていないため、ネストされた構造を使用した正規表現ではありません。また、ソリューションは入力の可能な構造に依存します。だから、 '(a(b(c(d)e)f)g)'のように、より括弧が入れられているかどうかを知る必要があります。もしそうなら、何が結果になるはずですか? – Pshemo

+0

@Pshemoしかし、入れ子の一定の深さに対処することができます。 –

答えて

0

あなたはグループの周りに別の中括弧を追加する必要があります。また、あなたは固定括弧括弧と一致していないことを確認する必要があります。

String noun_phrase = "(NP (PRP I))"; 
    Pattern pattern = Pattern.compile("\\([^(]*\\(([^)]*)\\)[^)]*\\)"); 
    Matcher matcher = pattern.matcher(noun_phrase); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 

否定文字クラス[^(][^)]はあなたがあまりにも熱心に括弧を一致していないことを確認してください。

0

まあ、あなたがあなたの括約筋にどれくらい深く行くことができないか分からないので、私は2つの可能な解決法を提案します。

解決策1:あなたの質問と同じ深さと仮定します。

この正規表現は動作します:Pattern pattern = Pattern.compile("\\(([^()]*)\\)")

解決策2:深度は任意であると仮定します(ただし、少なくとも最も内側の文字列は小括弧で囲まれています)。

この場合、さらに変更を加える必要があります。まず、パターンは次のようになります:Pattern pattern = Pattern.compile("(\\(.*)*\\(([^)]*)\\)")。違いを見ます?あなたは2つのグループを持っています。最初の一致は、すべてがパランシェで囲まれた最も内側の部分ですが、2番目のグループはまさにあなたが望むものです。つまり、ループではmatcher.group(1)matcher.group(2)に変更する必要があります。さらに、[^)]はあなたのグループに閉じた括弧がないことを確認します。

関連する問題