我想为这个 BNF 语法编写 preg_match 函数。
EXP ::= EXP + TERM | EXP - 术语 |学期
学期 ::= 学期 * 因子 |学期/因素 |因子
因子 ::= ( EXP ) |数字
数字:= 0 | 1 | 2 | 3
我试着这样写
$pattern = "|[0-3+-()*/]+\$$|";
但问题是,它接受字符串 33$,根据我的语法这是无效的 所以根据我的语法 1+22$ 应该是无效的,因为数字应该是 0|1|2|3.
我犯了什么错误?有人可以帮帮我吗?
编辑:
例子: 1+22$ 应该是无效的字符串,因为我只想要数字 0,1,2,3 而不是任何数字 > 3
谢谢。
试试这个图案?
/^([0-3][+-*/])+[0-3]\$$/
带括号的解决方案对于正则表达式来说不是微不足道的;
/^(\(?[0-3]\)?[+-*/])+[0-3]\)\$$/
允许您创建正确的表达式,例如 (2+3)$ 但也可以创建错误的 (2+3$
为此编写你自己的词法分析器
preg_match("/[^.\d]/i", "text123");
结果 - 123