2010-06-28 90 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