Java匹配无限嵌套的括号

  在Java中单纯依靠正则表达式是无法匹配无限嵌套的括号的,还好有antlr这个大杀器可以轻松解决这个问题,开源就是好啊。

 

1. 材料

antlr-4.4-complete.jar

 

2. 文法文件Json.g4

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());
	}

}

 

是不是很简单呀!只要把大括号替换为中括号或小括号,就可以匹配无限嵌套的中括号和小括号了。

 

你可能感兴趣的:(java)