正则表达式或扫描仪

时间:2011-11-14 03:11:34

标签: regex parsing

我的模式中有一堆短字符串:

<text @varible1 more text><, @variable2 text ><@variable3 text text>
@variableN是占位符,每个括号都是一个'section',表示如果封闭的varibale是空字符串,则'section'将不存在。我正在考虑使用正则表达式来提取每个部分,然后根据相应的变量是否为空来重新组装整个字符串。例如,如果我传递@ variable1 ='hello'@ variabl3 ='world',整个字符串将返回为:

text hello more text, world text

起初我想也许我可以使用足够的正则表达技巧来完成工作。然后我发现“部分”可能会嵌套,我还需要逃避一些特殊字符,例如 - 显然 - '&lt;','&gt;'和'@'。我越想它就越像我的DSL。那么开发扫描仪可能会更好吗?我只知道编写解析器。所以我有点卡住了,不知道要走哪条路。

如果有人在这种情况下有经验,请详细说明。感谢。

语法示例

 <text @varible1 more text><, @variable2 text ><@variable3 text text>
 <text @varible1 more text><, @variable2 <, @nestedVaraible> text \<@userName\> >  # with nesting and escaping
 <text @varible1 more text><, @variable2 text ><@variable3 \@twitterAccount> # escaping‘@

2 个答案:

答案 0 :(得分:2)

如果你想写自己的解析器,这对于这种情况会很有趣,那么我会查看Douglas CrockfordJSLint。他发布了所有代码,并有一些非常好的评论。

对于更普遍的事情,我肯定会查看这个方便的问题:Writing a simple parser

答案 1 :(得分:1)

你可以使用PHP正则表达式,但如果你对编写解析器的想法持开放态度,我认为这是投资时间的更好方法。这是我提出的最简单的正则表达式,以匹配您的文本:

$rgx = '~((?:[^<>\\\\]++|(?:\\\\.)++)++)|(<(?:(?1)|(?-1))*+>)~';

...所有这一切都将字符串划分为括号内的部分与其他所有部分。它只在一个层面上做到了;你必须递归地将它应用到每个括号内的部分,直到你挖出所有嵌套的部分。更不用说你要做的所有其他处理,从找到变量名开始。正则表达式可能非常强大,但更令人惊讶的是,在创建正则表达式之后,你需要做大量的工作才能完成工作。

Python的正则表达不是那么强大,这可能是一件好事,虽然它像我这样的正则表达式瘾君子令人沮丧。 :P它的代替是pyparsing。我自己从未使用它,但一直听到它的好消息。这可能正是你所需要的。