我正在尝试编写一个正则表达式来匹配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正则表达式并匹配“(())”,“()”和“(((((((()))))))”但不是“(”或“(() “等等。
答案 0 :(得分:1)
正确,它不常规,因此您无法将其与1个常规非递归表达式匹配。
但是,您可以创建一个循环来替换每个匹配,直到没有更多匹配可用。
因此...
[[[ foo ]]]
[[PLACEHOLDER_001]]
[PLACEHOLDER_002]
PLACEHOLDER_003
这样你可以毫无问题地使它工作。但不能说这是一个非常漂亮的解决方案。基于堆栈的解决方案会更好。
答案 1 :(得分:0)
你是正确的,嵌套结构不是常规语言,因此无法通过纯正则表达式表达。
PCRE能够指定递归正则表达式,虽然我不确定PHP的实现是否包含该支持。
但实际上,你想要做的就是自己编写一个状态机(有嵌套的记忆)。