我需要在string中找到所有java代码。字符串可以包含任何文本。这是我的正则表达式,但是当我运行程序时,它可以工作很长时间而不会停止
private static final String PATTERN_CODE = "[^;,\\{\\}]+\\s+[^;,{}]+\\s*\\{.*?\\}";
我试图找到这个正则表达式的一些例子,但我一无所获(
答案 0 :(得分:0)
你无法在带有正则表达式的strinh中找到java代码,你必须考虑变量声明/初始化,内部类等。
你需要一个解析器。
您可以使用antlr和java grammar(有两个版本的java7和java8)来检测字符串是否包含有效的Java片段。您可以编写自定义ErrorListener
来定义如何处理无效的Java片段。
<强>更新强>
这是一个示例程序,如果输入中的String不是有效的java程序,则抛出RuntimeException:
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是一个从命令行运行amand4.jar的脚本,可以找到Java.g4 here