使用 preg_match 验证表达式
Validating expression using preg_match
美好的一天!我正在尝试创建一个程序来接受来自用户的 Lambda 表达式,这个程序所做的是检查它是否是一个有效的 Lambda 表达式。
示例 - 用户输入 (λa.abc)a -> 然后验证
我的问题是我对Regex函数的了解非常有限,我一直在使用preg_match来解决这个问题,但仍然没有太大进展。任何帮助将不胜感激.. 谢谢 :)
嗯,这些是有效 λ 表达式的规则
- a single variable = (single letter)
- function application = (λ-expression)(λ-expression)
- 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 的那种东西。
美好的一天!我正在尝试创建一个程序来接受来自用户的 Lambda 表达式,这个程序所做的是检查它是否是一个有效的 Lambda 表达式。
示例 - 用户输入 (λa.abc)a -> 然后验证
我的问题是我对Regex函数的了解非常有限,我一直在使用preg_match来解决这个问题,但仍然没有太大进展。任何帮助将不胜感激.. 谢谢 :)
嗯,这些是有效 λ 表达式的规则
- a single variable = (single letter)
- function application = (λ-expression)(λ-expression)
- 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 的那种东西。