2012-02-08 33 views
7

Tôi muốn phân tích một câu lệnh khai báo biến và nhận tên biến. Tôi đang làm việc dướiregex để khớp khai báo biến trong java

String var = "private String ipaddress;"; 

tôi đang sử dụng mô hình regex dưới đây để phù hợp với chuỗi trên

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

Nó không làm việc. Nó nói không phù hợp được tìm thấy Có thể bất kỳ một trong những xin vui lòng giúp đỡ.

+1

Chỉ vì tò mò - mặc dù điều đó có thể giúp chúng tôi giúp bạn tốt hơn: trường hợp sử dụng cho điều này là gì? Bạn muốn đạt được điều gì với phân tích cú pháp đó? – Thomas

Trả lời

3

.*private\\s+(\\w*)\\s+(\\w*);
sử dụng mẫu này. [a-z] là chữ thường, nhưng "Chuỗi" trong văn bản của bạn bắt đầu bằng chữ hoa S. \\w là một ký tự từ. Nó giống như [a-zA-Z0-9_]
Có vẻ như các văn bản của bạn sẽ giống như "private <type> <field name>;" và nếu đúng như vậy, loại của bạn có thể chứa chữ thường viết hoa, số hoặc gạch dưới, vì vậy viết \\w là một giải pháp tốt.

+1

chỉnh sửa nhỏ: z thứ hai trong định nghĩa của bạn '\ w' phải là chữ hoa đứng :) – Thomas

10

Trước hết, hãy xóa dấu chấm đó khỏi đầu regex, vì nó yêu cầu ký tự trước số private cho phù hợp.

Thứ hai, regex của bạn phân biệt chữ hoa chữ thường và không khớp với số vốn. Hoặc sử dụng [a-zA-Z] hoặc làm cho trường hợp biểu thức không nhạy cảm ((?i) khi bắt đầu IIRC).

Btw, [a-zA-Z0-9_] sẽ giống như \w.

Một điều khác: biểu thức của bạn cũng sẽ bắt các tên biến bất hợp pháp cũng như bỏ lỡ các tên hợp pháp. Các biến không được phép bắt đầu bằng một số nhưng chúng cũng có thể chứa các ký hiệu đô la. Do đó, biểu thức tên phải là một cái gì đó giống như ([a-zA-Z_$][\w$]*) có nghĩa là ký tự đầu tiên phải là một chữ cái, dấu gạch dưới hoặc ký hiệu đô la theo sau bởi bất kỳ số ký tự từ hoặc ký hiệu đô la nào.

Lưu ý cuối cùng: tùy thuộc vào những gì bạn làm với những tuyên bố đó, hãy nhớ rằng bạn có thể phải kiểm tra các từ dành riêng. Biểu thức được điều chỉnh sẽ vẫn khớp với ví dụ "private String private".

Lưu ý cuối cùng khác: hãy nhớ rằng có thể có nhiều công cụ sửa đổi hơn private cho một biến, ví dụ: public, protected, static v.v. - hoặc không có gì cả.

Sửa:

Bây giờ bạn có dấu hoa thị sau dấu chấm đầu tiên, đó không phải là một vấn đề đối với trường hợp đặc biệt của bạn. Tuy nhiên, một dấu chấm khớp với hầu hết mọi ký tự và do đó sẽ khớp với fooprivate. Tùy thuộc vào những gì bạn muốn đạt được hoặc xóa dấu chấm hoặc thêm \s+ sau số .*.

+0

dấu chấm ở đầu là chính xác, vì nó được theo sau bởi' * 'cũng sẽ không khớp với dấu chấm. –

+0

@CarlosHeuberger có, bây giờ nó là phần nào đúng, mặc dù nó sẽ phù hợp với 'barprivate' là tốt. Tuy nhiên, khi tôi viết điều đó, dấu hoa thị bị thiếu (hoặc ít nhất là tôi không thấy nó do vấn đề định dạng) :) – Thomas

+0

OK, và 1 lý do khác để không sử dụng regex để phân tích ... –

3

Bạn nên sử dụng regex này:

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

này sẽ đảm bảo cho phù hợp:

  • Trường hợp trận đấu nhạy cảm, ngoại trừ từ khóa private
  • tờ khai dòng đa
  • không gian màu trắng ở đầu, cuối và ở giữa
+0

điều này sẽ (có thể sai) khớp với 'PRIVATE ...' –

+0

@CarlosHeuberger: Cảm ơn đã cập nhật câu trả lời. – anubhava

5

Kể từ khi tuyên bố của một biến trong Java có thể có nhiều 3 từ trước tên biến, tôi sẽ đề nghị bạn không giới hạn tìm kiếm và sử dụng này:

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)); 
} 

Nó sẽ tìm kiếm bất kỳ tên biến bắt đầu với khoảng trắng và kết thúc bằng ";" hoặc "=". Đây là tìm kiếm tổng quát hơn về tên biến.

EDIT Cái này tôi đã suy nghĩ thực sự, vì đây cũng là lời tuyên bố pháp lý trong Java:

private 
static 
volatile 
String 
s , t1 = ""; 

này thực sự có thể được cải thiện có lẽ vì nó đã được thinked/thực hiện nhanh chóng.

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

Xem xét các mẫu regex cho các quy ước đặt tên (loại, phương pháp, gói v.v.). Thông tin thêm here.