使用 preg_match 验证表达式

Validating expression using preg_match

美好的一天!我正在尝试创建一个程序来接受来自用户的 Lambda 表达式,这个程序所做的是检查它是否是一个有效的 Lambda 表达式。

示例 - 用户输入 (λa.abc)a -> 然后验证

我的问题是我对Regex函数的了解非常有限,我一直在使用preg_match来解决这个问题,但仍然没有太大进展。任何帮助将不胜感激.. 谢谢 :)

嗯,这些是有效 λ 表达式的规则

  1. a single variable = (single letter)
  2. function application = (λ-expression)(λ-expression)
  3. function abstraction = λ(variable).(λ-expression)

这是我用preg_match

做的代码
if(preg_match("/\((L([a-z])*.(([a-z])*)*)\)/", $getexpression, $match)):
print "Valid!";

效果不是很好

我必须承认我没有从你对表达式的定义中得到太多,因为你基本上是说 "an expression is a variable, or a collection of variables"。
我通常建议避免在定义本身中使用您要定义的词。

就是说,通过阅读维基百科和评论,我想我可能已经明白了什么可以被解释为一个有效的正则表达式:

// Basic definition: Lambda + letter == variable.
$lVar = 'λ[a-z]';

// Complex definition: Variable, possibly followed by variables,
// and closed with a letter preceeded by a dot or whitespace.
$lExp = "({$lVar}(?:\.{$lVar})*(?:[ .][a-z]+))";

// Complete definition:
//    1. Only single  expression.
//    2. Or a parameterized expression which may contain
//       the entire pattern recursively.
$lRegEx = "/^$lExp|\($lExp(?R)\)\Z/u";

也就是说,我不是 100% 确定这可以用正则表达式测试。至少不完全。这似乎是你需要 write/use a tokenizer 的那种东西。