正则表达式检查多维数组语法

时间:2011-02-09 01:18:47

标签: regex

我正在尝试编写一个正则表达式来匹配ruby的列表和哈希语法,例如:

[:a, "b", c, 3]

{:a => [
    1,2,3
]}

[1, {
    a => "t", :b => "w",
    :c => :o
}, 3]

当然,问题在于事物的嵌套/递归性质。我有一种潜在的怀疑,即这种嵌套结构实际上不能表达为正则表达式,因为“语言”不是常规的。我希望解决方案必须涉及子程序和递归,但是我很难理解它。任何人都可以确认/否认我的怀疑或提供解决方案吗?

任何帮助表示感谢。

编辑:作为备注,我主要使用PHP的preg_*方法

编辑:作为另一个注释,我创建了一个例程<ruby_value>来匹配键和标量值。

编辑:我应该指明我对这种“出于兴趣”更感兴趣。我已经在PHP中为这些东西编写了一个迷你解析器,但我很想知道是否存在一个不一定纯粹的正则表达式解决方案。

E.g。相等的嵌套括号:

/^(?<paren_expr>
    \( (?: (?&paren_expr) | ) \)
)$/x

哪个是有效的PHP正则表达式并匹配“(())”,“()”和“(((((((()))))))”但不是“(”或“(() “等等。

2 个答案:

答案 0 :(得分:1)

正确,它不常规,因此您无法将其与1个常规非递归表达式匹配。

但是,您可以创建一个循环来替换每个匹配,直到没有更多匹配可用。

因此...

[[[ foo ]]]

[[PLACEHOLDER_001]]

[PLACEHOLDER_002]

PLACEHOLDER_003

这样你可以毫无问题地使它工作。但不能说这是一个非常漂亮的解决方案。基于堆栈的解决方案会更好。

答案 1 :(得分:0)

你是正确的,嵌套结构不是常规语言,因此无法通过纯正则表达式表达。

PCRE能够指定递归正则表达式,虽然我不确定PHP的实现是否包含该支持。

但实际上,你想要做的就是自己编写一个状态机(有嵌套的记忆)。