Php 预匹配don';对于给定的正则表达式,不允许字母和0-3个数字
我想为这个BNF语法编写一个preg_匹配函数Php 预匹配don';对于给定的正则表达式,不允许字母和0-3个数字,php,preg-match,Php,Preg Match,我想为这个BNF语法编写一个preg_匹配函数 EXP ::= EXP + TERM | EXP - TERM | TERM TERM ::= TERM * FACTOR | TERM / FACTOR | FACTOR FACTOR ::= ( EXP ) | DIGIT DIGIT ::= 0 | 1 | 2 | 3 我不想让任何字母和数字大于3,字符串应该以$sign结尾。我尝试过这些模式,但不起作用。我不明白我犯了什么错误 $pattern = "|[0-3\+\-()*/]
EXP ::= EXP + TERM | EXP - TERM | TERM
TERM ::= TERM * FACTOR | TERM / FACTOR | FACTOR
FACTOR ::= ( EXP ) | DIGIT
DIGIT ::= 0 | 1 | 2 | 3
我不想让任何字母和数字大于3,字符串应该以$sign结尾。我尝试过这些模式,但不起作用。我不明白我犯了什么错误
$pattern = "|[0-3\+\-()*/]+\\$$|";
$pattern = "|[^A-Za-z][0-3\+\-()*/]+\\$$|";
编辑:
我也试过这个
$pattern=“| ^[0-3+-()*/]+\$$|”
但是这允许12+1$,我不想允许任何数字>3
谁能帮我一下吗
谢谢。如果您试图验证表达式,您需要做的不仅仅是确保其中只包含允许的字符。至于数字呢?它们之所以存在,是因为
[0-3]+
至少匹配一个数字,但如果需要,也可以匹配几十个数字
作为参考,您的BNF描述的语言不是常规语言。一个纯粹的正则表达式不能用它做任何事情。(例如,它必须能够跟踪括号的级别……有限状态自动机(如REs)无法计数。)
幸运的是,PCRE不仅仅是常规正则表达式。:)至少在PHP中,它们允许递归,这对于匹配嵌套括号等是绝对必要的
$pattern = ':^(([0-3]|\((?1)\))([+*/-](?1))?)\$$:';
(?1)
是对第一个子模式的递归引用——实际模式,而不是它匹配的文本。这就像是将图案本身粘贴到其中,除非你很难无限地剪切和粘贴P在本例中,它指的是([0-3]|\(?1)\)([+*/-](?1))?
除此之外,我使用的是一种简化的语法(减去操作顺序,因为无论如何你都不能用正则表达式来解析它)
实际模式中的
(?1)
与EXP几乎完全对应。\\$$
将难以解释。这是一个反斜杠,一个$,然后是一个字符串结束锚吗?也许你只需要\$$
,就可以得到一个文字$和一个字符串结束锚。@MarcB:他必须经历那种丑陋,因为模式是双引号的<代码>\$$会给他两个字符串。(提示@user:不要重复引用REs。这通常会让事情变得更痛苦。)
DIGIT : [0-3]
OPER : [+*/-]
LPAREN : '('
RPAREN : ')'
EXP : (DIGIT | LPAREN EXP RPAREN ) (OPER EXP)?
PATTERN : EXP '$'