RegEx帮助(适用于PHP)

时间:2011-04-26 20:08:32

标签: php regex

我正在研究一种用于个人用途的小“开发”语言。我根本不打算让它先进(虽然我不知道后来会发生什么),但我遇到了问题。

我对RegExp不太熟悉,我想用它来检查代码的一部分是定义新变量还是运行函数。在这种情况下,我需要一个RegExp来检查用户是否正在定义一个变量。

所以,让我说我有这样一个部分: $ abcd = 5

现在,RegExp应符合下一个标准:    - 它应该检查第一个字母是否是“$”(这很简单:“\ $”)    - 现在,“$”之后的字母(让我们称之为变量名)是问题所在。变量     名称可以包含字母[a-z,A-Z],数字[0-9]和下划线[_]    - 接下来,变量名和“=”之间的空间可以无限长(它可以     是一个空间(),或数百万个空间 - 这应该没有区别    - 比等号(这很容易 - “\ =”)    - 与第三个相同,适用于等号后的空格    - 并在最后变量值。应该没有RegExp验证。

提前致谢!

3 个答案:

答案 0 :(得分:3)

您不希望将正则表达式用于此类任务。它很快就会变成一场噩梦。你想要的是一个简单的语法和一个递归下降的解析器。

话虽如此,这样的事情应该有效:

/\$[a-zA-Z0-9_]+\s*=\s*[0-9]+$/

这只会匹配您为变量指定数字的情况。如果你想分配其他值,你将不得不使正则表达式更复杂(看看我的意思是它变成了一场噩梦?:))。例如,如果要为变量指定字符串值,则正则表达式将不同。您还必须考虑转义引号和连接等内容。用正则表达式做这些事情非常困难。

函数调用和变量定义的简单语法可能如下所示:

<program>             ::= { <statement> }
<statement>           ::= <function-call> | <variable-assignment>
<function-call>       ::= <identifier>, '(', [ <parameter-list> ], ')'
<identifier>          ::= <valid-starting-char>, { <valid-char> }
<valid-starting-char> ::= [A-Za-z_]
<valid-char>          ::= [A-Za-z]
<parameter-list>      ::= <identifier>, { ',', <identifier> }
<variable-assignment> ::= '$', <identifier>, '=', <value>
<value>               ::= <number> | <string>
<number>              ::= <digit>, { <digit> }
<string>              ::= '"', ( { <character> | <escaped-character> } ), '"'
<character>           ::= .
<escaped-character>   ::= '\', <character>

该语法不考虑连接,带小数值的数字(即小数点后)和负数。但它很简单,应该给你一个很好的起点。有许多教程告诉您如何从recursive-descent创建EBNF解析器。您仍需要对输入进行标记化。

答案 1 :(得分:0)

好的,首先,如果你正在创建一种语言,你需要一个词法分析器来标记字符串(基于正则表达式)和解析器来解释语言(基于语法)。

话虽如此,你的正则表达式是:

\$[a-zA-Z_0-9]+[ \t\n]*=[ \t\n]*[0-9]+

答案 2 :(得分:0)

只需快速了解上述回复:

[a-zA-Z0-9_] 

相同
\w