RegexCompiler.java 文件源码

java
阅读 15 收藏 0 点赞 0 评论 0

项目:moar 作者:
public static Regex compile(String regexStr) {
    StringBuilder additionalMessage = new StringBuilder();
    RegexParser parser = regexParser( regexStr );
    parser.getErrorListeners().clear();
    parser.addErrorListener(
            new BaseErrorListener() {
                @Override
                public void syntaxError(
                        Recognizer<?, ?> recognizer,
                        Object offendingSymbol,
                        int line,
                        int charPositionInLine,
                        String msg,
                        RecognitionException e) {
                    additionalMessage.append( "SyntaxEception in Regex: \"" )
                            .append( regexStr )
                            .append( "\": " )
                            .append( msg );
                    if ( offendingSymbol instanceof CommonToken ) {
                        CommonToken token = (CommonToken) offendingSymbol;
                        if ( token.getText().equals( "*" ) || token.getText().equals( "+" ) || token.getText()
                                .equals( "?" ) ) {
                            additionalMessage.append( ", dangling metacharacter: '" )
                                    .append( ((CommonToken) offendingSymbol).getText() )
                                    .append( "' at line " )
                                    .append( token.getLine() )
                                    .append( ", pos " )
                                    .append( token.getCharPositionInLine() );
                        }
                    }
                }
            }
    );
    RegexParser.RegexContext regexTree = parser.regex();
    if ( parser.getNumberOfSyntaxErrors() > 0 ) {
        throw new IllegalArgumentException( "malformed regex found : " + regexStr + "\n" + additionalMessage.toString() );
    }
    ParseTreeWalker walker = new ParseTreeWalker();
    RegexGroupNameListener nameListener = new RegexGroupNameListener();
    walker.walk( nameListener, regexTree );

    RegexTreeListener listener = new RegexTreeListener( nameListener.getGroupNames() );
    walker.walk( listener, regexTree );

    return listener.finalRegex();
}
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号