Вы не можете найти 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
Что вы считаете «Java-код» внутри строки произвольного текста? Каждая подстрока, которая формирует полную действительную программу Java? Или каждая подстрока, которая может (в зависимости от контекста) корректно отображаться в программе Java? Если последние являются подстроками, которые действительны в строковом литерале Java, также «java code»? –
Например, у меня есть книга о программировании на Java, в ней есть примеры текста и кода. Поэтому мне нужно разделить код и текст. – OranGE
Возможно, вы, вероятно, переделываете это. Вы узнаете больше из своей книги, если вы прочтете ее и скопируйте фрагменты, чтобы попробовать, когда вы идете вперед. И вы узнаете еще больше, если вы наберете фрагменты в себе, попробуйте их, затем попробуйте свои собственные варианты и попытайтесь предсказать, что они будут делать, когда вы их измените. –