2010-06-28 87 views
0

我想在Java中编写一个模式来匹配Java导入声明。Java进口声明正则表达式

例子:

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.InputFormat; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
// import org.apache.hadoop.mapreduce.Something; 
/* import org.apache.hadoop.something.else; */ 

将匹配只有:

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.InputFormat; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 

到目前为止,我有以下的正则表达式:

"[^A-Za-z0-9\\n]? *import(static|\\s)+[\\w.]*(\\*)?(\\s)*;" 

但它不工作。例如:

import org.junit.Test; 
import java.util.ArrayList; 
/* The import name; lazily initialized; defaults to a unspecified,... 

回报:

import org.junit.Test; 
import java.util.ArrayList; 
import name; 

这是不对的。

+5

“它不工作”是最糟糕的问题说明。什么不工作?你有误报吗?假阴性?它会崩溃吗?它运行时烧毁你的房子吗? – 2010-06-28 15:15:49

+0

如果你打算做这样的事情,你确定Regex是答案吗?你确定某些词法分析器/解析器导向(比如javac这样做)会不会更容易? – corsiKa 2010-06-28 15:17:32

+0

它比它应该更多。 – 2010-06-28 15:21:48

回答

0

我得到了它的使用标志的工作。

现在看起来如下:

Pattern.compile("(;|^ *)import(static|\\s)+[\\w.]*(\\*)?(\\s)*;",Pattern.MULTILINE); 
+0

这样做是否可以,如果我标记我的答案是正确的? – 2010-06-28 16:16:20

+0

如果导入声明使用unicode转义,例如这不起作用。 '\ u0069mport \ u0020java \ u002Eutil \ u002E \ u002A \ u003B'。也许不太可能,但这是正则表达式将错过的有效的Java导入声明。你也可以像'importstaticstaticstatic ....;'那样匹配 – polygenelubricants 2010-06-28 18:44:33

0

如何:

^import 
+0

会抓住'/ * import blah的第二行; \ nimport foo; * /'当它不应该。 – corsiKa 2010-06-28 15:26:05

+0

@ glowcoder nope,它不会匹配,请注意^ anchor。 – unbeli 2010-06-28 15:27:51

+0

@glowcoder啊,好吧,用\ n。是的,但没有人要求别的;) – unbeli 2010-06-28 15:28:26