我想了解如何在Java中使用正则表达式,并发现以下任务: 编写一个类来检查给定的输入字符串是否是基于BNF形式的这些条件的有效算术术语:Java正则表达式循环引用模式
term = [Vz]summand|[Vz]summand addOp term
summand = factor | factor mulOp summand
factor = number | '('term')'
number = digit | digit number
digit = '0'|'1'|...|'9'
vz = '+'|'-'
addOp = '+'|'-'
mulOp = '*'|'/'
利用这些规则,我写了一些图案,形似不同的类型:
static Pattern vz = Pattern.compile("[+-]");
static Pattern addOp = Pattern.compile("[+-]");
static Pattern multOp = Pattern.compile("[*/]");
static Pattern digit= Pattern.compile("[0-9]");
static Pattern number = Pattern.compile(digit.pattern()+"+");
static Pattern factor = Pattern.compile(number.pattern()+"|("+term.pattern()+")");
static Pattern summand = Pattern.compile(factor.pattern()+"|"+factor.pattern()+ multOp.pattern()+"\n");
static Pattern term = Pattern.compile(vz.pattern()+"?"+summand.pattern()+"|"
+vz.pattern()+"?"+summand.pattern()+addOp.pattern()+"\n");
你已经看到我的问题:我在因素的definiton参考项目,而不必首先定义。不幸的是,我无法以任何方式切换它。所以我的问题是:
有没有可能以这种方式引用模式?或者任何其他引用一个模式并在以后定义它?
这是几乎不可能的任务。您的语法定义了一种可以在任何深度均衡圆括号的语言。这不能由正则表达式来处理。 (换句话说,你的语法是上下文无关的,但不是固定的。)摆脱'factor ='('term')的生产,你可能有机会。 –
@ m.buettner如果你做出了答案,我会鼓励你。 – Jeff