Javaは無限ネストのかっこにマッチします

1426 ワード

Javaでは単純に正規表現では無限にネストされたカッコに合わないので、antlrという大殺器があれば簡単にこの問題を解決できるので、オープンソースがいいでしょう.
 
1.材料
antlr-4.4-complete.jar
 
2.文法文書Json.g 4
grammar Json;

@header{
package a3;	
}

LEFT_BRACKET : '{';
RIGHT_BRACKET : '}';
ANY_CHAR : (~('{' | '}'))+;

bracket_body : LEFT_BRACKET (ANY_CHAR | bracket_body)* RIGHT_BRACKET;
expr : (bracket_body)+;

 
2.テスト
 
import java.util.List;

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;

import a3.JsonLexer;
import a3.JsonParser;
import a3.JsonParser.Bracket_bodyContext;
import a3.JsonParser.ExprContext;

public class Test3 {

	public static void main(String[] args)throws Exception {
		run("{}{1111}{1:{aa:{s}}}");

	}
	
	public static void run(String expr)throws Exception{
		ANTLRInputStream in = new ANTLRInputStream(expr);
		JsonLexer lexer = new JsonLexer(in);
		CommonTokenStream tokens = new CommonTokenStream(lexer);
		JsonParser exprParser = new JsonParser(tokens);
		ExprContext exprContext = exprParser.expr();
		System.out.println(exprContext.getText());
		List list = exprContext.bracket_body();
		System.out.println(list.size());
		System.out.println(list.get(2).getText());
	}

}

 
簡単じゃないですか.大かっこを中かっこまたは小かっこに置き換えるだけで、無限にネストされた中かっこと小かっこを一致させることができます.