2010-06-28 3 views
0

Я пытаюсь написать шаблон в Java, чтобы соответствовать объявлениям импорта Java.Java Imports Объявление regex

Пример:

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

«это не работает» это наихудшее описание проблемы. Что именно не работает? У вас есть ложные срабатывания? Ложные негативы? Это крушение? Он сжигает ваш дом, когда вы его запускаете? –

+0

Если вы собираетесь сделать что-то подобное, уверены ли вы, что Regex является ответом? Вы уверены, что ориентированный на lexer/parser (например, javac) не будет проще? – corsiKa

+0

Это больше, чем нужно. –

ответ

0

Я получил это работает с использованием флага.

Теперь он выглядит следующим образом:

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

Это нормально, если я отмечаю свой ответ как правильный? –

+0

Это не работает, если декларация импорта использует unicode escape-последовательности, например. '\ U0069mport \ u0020java \ u002Eutil \ u002E \ u002A \ u003B'. Возможно, не очень вероятно, но это допустимая декларация импорта Java, которую будет пропущено регулярное выражение. Кроме того, вы сопоставляете такие вещи, как 'importstaticstaticstatic ....;' – polygenelubricants

0

Как об этом:

^import 
+0

Уловил бы вторую строку '/ * import blah; \ nimport foo; */', если это не так. – corsiKa

+0

@glowcoder nope, он не будет соответствовать этому, обратите внимание на якорь ^. – unbeli

+0

@glowcoder ah, ok, с \ n. Да, но никто ничего не просил;) – unbeli