用于在文本

时间:2015-10-10 15:45:56

标签: java regex parsing

我需要在string中找到所有java代码。字符串可以包含任何文本。这是我的正则表达式,但是当我运行程序时,它可以工作很长时间而不会停止

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

我试图找到这个正则表达式的一些例子,但我一无所获(

1 个答案:

答案 0 :(得分:0)

你无法在带有正则表达式的strinh中找到java代码,你必须考虑变量声明/初始化,内部类等。

你需要一个解析器。

您可以使用antlrjava 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