Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 预匹配don';对于给定的正则表达式,不允许字母和0-3个数字_Php_Preg Match - Fatal编程技术网

Php 预匹配don';对于给定的正则表达式,不允许字母和0-3个数字

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\+\-()*/]

我想为这个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\+\-()*/]+\\$$|";

$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 '$'