2017-01-06 10 views
1

括弧内の文字列を取得するにはどうすればよいですか?以下のコードを参照してください。括弧内のJava正規表現による文字列を取得する方法

String str = "C1<C2, C3<T1>>.C4<T2>.C5" 

私はC1<C2, C3<T1>>C4<T2>、およびC5を取得する必要があります。

を参照してくださいコードIは

Pattern pat = Pattern.compile("(\\w+(<[^>]+>)?)(.\\w+(<[^>]+>)?)*"); 
Matcher mat = pat.matcher(str); 

の下にしようとしたが、結果は、私はあなたのコードを参照2つの問題がある

C1<C2, C3<T1> 
+2

私は考えています*ネストされた角括弧の数を一定量に制限した場合、これは可能です。通常、これにパーサを使用します。 – markspace

+8

あなたは '.'に分割したいと思うように私に聞こえます。何か不足していますか? – shmosel

+1

@markspaceは正しいです。大括弧のネストを制限しない場合、これは正規表現では表現できません。 –

答えて

2

何であったか:あなたがいるよう

  1. に思えます結果をループする代わりに の代わりに最初の試合のみを印刷します。一致のリストを通じてwhile(mat.find())を使用して を繰り返します。
  2. \\w+(<[^>]+>+)?にパターンを簡略化してC1<C2, C3<T1>>,C4<T2>C5とすると、

    正規表現パターンを説明:

    • w+ = 1又はそれ以上の英数字または下線文字
    • ()? = 0または括弧内にあるものの1
    • < = <文字と一致
    • [^>]+ = 1以上の文字は、>文字まで
    • >+ = 1以上>文字(あなたが唯一の1つのまたは2つの>文字を強制したい場合、代替は>{1,2}だろう。)

あなたの結果のコードは次のようになります。

public static void main(String[] args) 
{ 
    String str = "C1<C2, C3<T1>>.C4<T2>.C5"; 
    Pattern pat = Pattern.compile("\\w+(<[^>]+>+)?"); 
    Matcher mat = pat.matcher(str); 

    while(mat.find()) { 
     System.out.println(mat.group()); 
    }  
} 

しかし、これを実現するもっと簡単な方法は、正規表現の代わりにsplit()を使用することです。文字列を.に分割し、配列にピースを保存して、必要に応じて配列を繰り返し処理することができます。

だけドットで分割
String[] parts = str.split("\\."); 
+1

あなたは' str.split( "\\。"); ' –

+1

を意味すると思います@ScaryWombat私はそれも意味していると思います: )ありがとう。私の答えを更新しました。 –

+0

@TotZamありがとう!これ大好き。私はこのcasのためにsplitを使うことができません、 "C1 > .C4 .C5"です。あなたが気にしないなら、質問がありますか? (。+?)とは何ですか? (。+?)とは何が違うのですか? – kimkevin

1

:以下で達成される

String[] parts = str.split("\\."); 

これは、あなたが問題のサンプル入力を使って何をしたいん。

+0

私の最終的な解決はそれでした:Dありがとうございます! – kimkevin

関連する問題