2012-02-08 15 views
7

変数宣言文を解析して変数名を取得します。私はそれが動作しませんJavaの変数宣言と一致する正規表現

.*private\\s+([a-z]*)\\s+([a-z0-9_]*); 

上記の文字列にマッチするには、以下の正規表現パターンを使用してメートル

以下
String var = "private String ipaddress;"; 

をしています。誰も助けてください。

+1

これは好奇心をそそらえていますが、それによって私たちはあなたをさらに良くすることができますが、これはどのようなケースですか?あなたはその解析で何を達成したいですか? – Thomas

答えて

3

.*private\\s+(\\w*)\\s+(\\w*);
このパターンを使用してください。 [a-z]は小文字ですが、テキストの "String"は大文字のSで始まります。 \\wは単語文字です。それは同じです[a-zA-Z0-9_]
あなたのテキストは"private <type> <field name>;"のようであり、そうなら、あなたのタイプは大文字の小文字、数字または下線を含むことができるので、\\wを書くことは良い解決策です。

+1

微妙な訂正: '\ w'の定義における2番目のzは大文字でなければなりません。 – Thomas

10

まず、一致するためにprivateの前に文字が必要なので、正規表現の先頭からそのドットを削除します。

第2に、正規表現では大文字と小文字が区別され、大文字と一致しません。 [a-zA-Z]を使用するか、式の大文字小文字を区別しないでください(開始IIRCで(?i))。

Btw,[a-zA-Z0-9_]は、\wと同じになります。

もう1つのこと:不正な変数名と合法的な変数名もキャッチします。変数は数字で始めることはできませんが、ドル記号も含めることができます。したがって、名前の式は([a-zA-Z_$][\w$]*)のようになります。最初の文字は英字、アンダースコア、ドル記号、任意の数の単語文字またはドル記号のいずれかでなければなりません。

最後の注:これらの宣言で何をするかによって、予約語を確認する必要があるかもしれません。調整された式は、たとえば、"private String private"と一致します。

もう1つ最後の注記:変数にはprivateよりも多くの修飾語がある可能性があります。 publicprotectedstaticなど - または全くありません。

編集

今、あなたはあなたの特別なケースのために問題になることはありません最初のドットの後にアスタリスクを持っていること。ただし、ドットはほぼすべての文字と一致し、したがってfooprivateと一致します。目的に応じて、ドットを削除するか、.*の後に\s+を追加します。

+0

先頭にあるドットは正しいです。ドットの出現にもマッチする' * 'が続きます。 –

+0

@CarlosHeubergerはい、 'barprivate'にもマッチしますが、やや正しいです。しかし、私はそれを書いたときにアスタリスクが見付かりませんでした(または少なくとも私は書式設定の問題のためにそれを見ていませんでした):) – Thomas

+0

OKと、正規表現を解析しないための1つの理由... –

3

あなたは、この正規表現を使用する必要があります。

^(?s)\\s*private\\s+(\\w+)\\s+(\\w+)\\s*;\\s*$ 

これが一致することを確認します。

  • 開始時にキーワードprivate
  • マルチライン宣言
  • 空白を除いて大文字小文字を区別しないマッチング、端および中間に
+0

これは(おそらく間違って) 'PRIVATE ... 'と一致します。 –

+0

@CarlosHeuberger:ありがとうございました。 – anubhava

5

Javaで変数の宣言が3つのワード変数名の前に、より多くを持つことができますので、私はあなたがあなたの検索を制限し、これを使用しないことをお勧めは:

String var = "private String ipaddress;"; 
//String var2 = "private static final int test=13;"; 

Pattern p = Pattern.compile(".+\\s(.+?)(;|=)"); 
Matcher m = p.matcher(var); 

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

それは始まる任意の変数名を探します空白をつけて ";"で終わります。または "="。これはより一般的な変数名の検索です。

private 
static 
volatile 
String 
s , t1 = ""; 

これは実際にそれがthinkedたとして/速く行わおそらく改善することができます。

EDITこの1つは、これはJavaでも法的な宣言であるので、私は、実際に考えるようになりました。

public static void main(String[] args) { 
String var0 = "private static final int test,test2;"; 
String var1 = "private \n static \n final \n int \n testName \n =\n 5 \n"; 
String var2 = "private \n static \n final \n String \n testName \n =\n \" aaa   = bbbb \" \n"; 
String var3 = "private \n static \n final \n String \n testName,testName2 \n =\n \" aaa   = bbbb \" \n"; 

String var4 = "int i;"; 
String var5 = "String s ;"; 
String var6 = "final String test ; "; 
String var7 = "public int go = 23;"; 
String var8 = "public static final int value,valu2 ; "; 
String var9 = "public static final String t,t1,t2 = \"23\";"; 
String var10 = "public \n static \n final \n String s1,s2,s3 = \" aaa , bbb, fff, = hhh = , kkk \";"; 
String var11 = "String myString=\"25\""; 

LinkedList<String> input = new LinkedList<String>(); 
input.add(var0);input.add(var1);input.add(var2);input.add(var3);input.add(var4);input.add(var5); 
input.add(var6);input.add(var7);input.add(var8);input.add(var9);input.add(var10); 
input.add(var11); 

LinkedList<String> result = parametersNames(input); 
for(String param: result){ 
    System.out.println(param); 
} 

} 

private static LinkedList<String> parametersNames(LinkedList<String> input){ 
LinkedList<String> result = new LinkedList<String>(); 
for(String var: input){ 

    if(var.contains("\n")) var = var.replaceAll("\n", ""); 
    var = var.trim(); 
    if(var.contains("=")){ 
     var = var.substring(0, var.indexOf("=")).trim() + ""; 
     Pattern p = Pattern.compile(".+\\s(.+)$"); 
     Matcher m = p.matcher(var); 

     if(m.find()){ 
     if(m.group(1).contains(",")){ 
      String [] tokens = m.group(1).split(","); 
      for(String token : tokens){ 
      result.add(token); 
      } 
     } else{ 
      result.add(m.group(1)); 
     } 
     } 

    } else{ 
     Pattern p = Pattern.compile(".+\\s(.+?)(;|=)"); 
     Matcher m = p.matcher(var); 

     if(m.find()){ 
     if(m.group(1).contains(",")){ 
      String [] tokens = m.group(1).split(","); 
      for(String token : tokens){ 
      result.add(token); 
      } 
     } else{ 
      result.add(m.group(1)); 
     } 
     } 
    } 
} 

return result; 
} 
3

命名規則(型、メソッド、パッケージなど)のためのCheckstyle正規表現パターンを見てください。詳細情報here