【发布时间】:2011-10-23 03:21:17
【问题描述】:
我正在尝试编写一个正则表达式,以验证我目前正在开发的 BB 样式代码中的变量分配。
变量赋值如下所示
[assign {var_name} = "string value"]
您可以分配给多个变量,例如
[assign {var1} = {var2} = true]
或者用
添加到变量中[assign {var_name} .= " more..."]
递增/递减变量
[assign {var}++] or [assign {var}--]
分配一个否定值
[assign {var1} = !{var2}]
到目前为止,我提出了以下正则表达式,但效果不太好
/
\[assign
(?:
[\s]*(?:
[\!]?\{[^\}]+\}(?:(?:\+\+)|(?:\-\-))?
|
[0-9]+
|
\"[^\"]+\"
|
\'[^\']+\'
|
true
|
false
)[\s]*(?:\=[\s]*|\.\=[\s]*)?
)+
\]
/
我遇到以下问题:
- 我需要确保在每个部分之间使用 .= 或 =
- 并确保将值和变量分配给变量,而不是分配给值的变量
- 最后确保有一个实际的赋值,除非值是递增或递减的
更新: 工作正则表达式
\[assign(?:\s)*
(
\{[^\}]+\}
(?:
\+\+
|
--
|
(?:\s)*(?:\.)?=(?:\s)*
(?:(?:!)?\{[^\}]+\}(?:\s)*(?:\.)?=(?:\s)*)*
(?:
[0-9]+
|
"[^"]+"
|
'[^']+'
|
true
|
false
|
(?:!)?\{[^\}]+\}
)
)
)
(?:\s)*\]
【问题讨论】:
-
我肯定有人会这么说,但让我成为第一个。这是一项更适合解析器和词法分析器的任务。
-
我将把它转换为 php,但在有人开始使用它之前,它不是一种模板语言。它是一种可供最终用户使用的语言。功能非常有限,这使我可以在转换和被 php 解析之前从本质上验证代码。验证是一项要求,因为用户不可能用错误的代码“破坏”事物。