2012-01-03 8 views
1

正規表現を使用してJavaのクラス宣言行を解析する必要があります。Javaのクラス宣言行を解析する正規表現

String line = "public class ActionDiagramReader extends XReader implements ActionHandler, Action {"; 
String line = "public class ActionDiagramReader extends XReader{"; 

私はこの正規表現

String regExp = ".*class\\s+(\\w+)(\\s+extends\\s+(\\w+))?(\\s+implements\\s+(\\w|,)+)?\\{.*$"; 
Pattern pattern = Pattern.compile(regExp, Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
Matcher match = pattern.matcher(line1); 

を使用しようとしています。しかし、この正規表現は、クラス名/エクステンダクラス名/実装者のCLAS-名を解析する失敗。指定された行に関連するすべてのクラス&のインタフェースを識別する必要があります。

正規表現に誤りがあります。 ありがとうございます

+0

これは何の目的ですか? – Sap

+0

アプリケーションのEclipseエディタでクラス名の色を付ける必要があります – Kishore

+0

(?<= public class \ s)。*?(?= \ s)と(?<= extend \ s)。*のようなものを使用できませんか? (?= [\ s {])ただの考え – Sap

答えて

0

正規表現の最後の部分がアクションを取得していません。

(\\s+implements\\s+(\\w|,)+)?\\{.*$ 

これはActionHandlerまでグラブされ、次に中括弧を探しているために終了します。 下の私の例では、最終的な\ wを角括弧に入れて、スペースのキャプチャも\ sを追加しました。この方法で、行の最後にも "Action"がキャプチャされます。

(\\s+implements\\s+([\\w,\\s]+))?\\s*\\{.*$ 

これが機能するかどうかを確認してください。

+0

それは動作しません:大括弧で囲まれたパイプはエスケープされているので、 "Piped | Interface implements"は間違って受け入れられます。 –

+0

ああ、ありがとう。実際にテストに成功したので、私はそれを捕まえませんでしたが、そこにはいけません。それは尋ねられたことの私の最高の解釈でした。 –

+0

ありがとう@フランシス。これは私のために働く。 – Kishore

0

あなたはエラーメッセージを説明していませんが、それ以上はあるかもしれませんが、1つの問題があります。継承キャプチャでは、1つの文字の多くのグループをキャプチャしています。

実装されたインターフェイスのリストを取得するには、その領域に([\\w,]+)を使用する必要があります。それ以外の場合は、これを使用して個々に個別に取得することをお勧めします。(\\w+)(?:,\\s*(\\w+))*

しかし、他の微妙なバグがあるかもしれません。それはあなたが見ているものとあなたが見たいものに依存します。

+0

ありがとう@プラチナ。できます。 – Kishore

+0

今、私はこの行で同じ正規表現をテストしました 'String line1 =" public class ActionDiagramReader extends XReaderはActionHandler、ActionHandler1、Action、Action1 {";}を実装しています。しかし、すべての実装クラスを識別することはできません。 – Kishore

+0

*それは何を識別しますか?より具体的にしてください。 –

関連する問題