2015-10-10 2 views
-1

Мне нужно найти весь код java в строке. Строка может содержать любой текст. Это мое регулярное выражение, но когда я запускаю программу, она работает в течение длительного времени и не остановитьRegexp для поиска кода Java в тексте

private static final String PATTERN_CODE = "[^;,\\{\\}]+\\s+[^;,{}]+\\s*\\{.*?\\}"; 

Я пытаюсь найти некоторые примеры этого регулярного выражения, но я ничего не нашел (

+0

Что вы считаете «Java-код» внутри строки произвольного текста? Каждая подстрока, которая формирует полную действительную программу Java? Или каждая подстрока, которая может (в зависимости от контекста) корректно отображаться в программе Java? Если последние являются подстроками, которые действительны в строковом литерале Java, также «java code»? –

+0

Например, у меня есть книга о программировании на Java, в ней есть примеры текста и кода. Поэтому мне нужно разделить код и текст. – OranGE

+0

Возможно, вы, вероятно, переделываете это. Вы узнаете больше из своей книги, если вы прочтете ее и скопируйте фрагменты, чтобы попробовать, когда вы идете вперед. И вы узнаете еще больше, если вы наберете фрагменты в себе, попробуйте их, затем попробуйте свои собственные варианты и попытайтесь предсказать, что они будут делать, когда вы их измените. –

ответ

0

Вы не можете найти Java код внутри strinh с регулярным выражением, необходимо принимать во внимание переменную декларации/инициализации, внутренние классы и т.д.

Вам нужен синтаксический анализатор.

вы можете использовать antlr и java grammar (есть две версии доступны java7 и ja va8), чтобы определить, содержит ли строка действительный фрагмент Java. Вы можете написать настраиваемый ErrorListener, чтобы определить, как обрабатывать недействительные фрагменты java.

UPDATE

Здесь ıA пример программы, которая бросает RuntimeException, если строка на входе не является допустимым программа Java:

package test.parsingjava; 

import java.io.StringReader; 

import org.antlr.v4.runtime.ANTLRInputStream; 
import org.antlr.v4.runtime.CommonTokenStream; 
import org.antlr.v4.runtime.tree.ParseTree; 
import org.antlr.v4.runtime.tree.ParseTreeWalker; 

import test.schyntax.parsing.ErrorListener; 

public class ParsingJava { 

    public static void main(String[] args) throws Exception { 
     String expression="class test { public void method() {}}"; 
     StringReader reader= new StringReader(expression); 
     ANTLRInputStream input = new ANTLRInputStream(reader); 
     JavaLexer lexer= new JavaLexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     JavaParser parser= new JavaParser(tokens); 
     parser.removeErrorListeners(); // remove ConsoleErrorListener 
     parser.addErrorListener(new ErrorListener()); 
     ParseTree tree = parser.compilationUnit(); 
     ParseTreeWalker walker = new ParseTreeWalker(); 
     // Walk the tree created during the parse, trigger callbacks 
     JavaListener listener=new JavaBaseListener(); 
     walker.walk(listener, tree); 
    } 

} 

ErrorListener является:

package test.parsingjava; 

import org.antlr.v4.runtime.BaseErrorListener; 
import org.antlr.v4.runtime.RecognitionException; 
import org.antlr.v4.runtime.Recognizer; 

public class ErrorListener extends BaseErrorListener { 
    @Override 
    public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { 
     throw new RuntimeException("Error at line " + line + ":" + charPositionInLine + " at " + offendingSymbol + ": " + msg); 
    } 
} 

другие классы генерируются из командной строки с использованием

antlr4 -package test.parsingjava Java.g4 

antlr4 скрипт, который запускает antrl4.jar из командной строки и Java.g4 можно найти here

+0

О, спасибо. Можете ли вы написать пример поиска кода Java в строке с использованием ANTLR? Это будет очень полезно – OranGE

+0

@OranGE сделано, пример с добавленным исходным кодом – Giovanni

+0

Большое спасибо! – OranGE

Смежные вопросы