我想了解如何在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