2011-10-10 81 views
1

我需要用下面的字符串分割的表达式:递归匹配的正则表达式

'with', 'select', 'from', 'where' 

这些会在序列中为我写的。你可以假定每个单词都以字界开始和结束。

我已经做了这个没有任何问题。但是,新的要求已经到来。 from子句可能包含整个表达式。

这意味着,所述表达可以是这样的:

with 
    something 
select 
    something more 
from 
    with 
     aaaa 
    select 
     bbbb  
    from 
     [may be another expression] 
    where 
     the inner expression ends here 
where 
    the outer expression ends here 

我不需要分裂内表达。

现在的问题是,有没有一种标准的方式来做这样的事情?或者我需要手动完成自己的工作?

我不确定它是否重要,我的应用程序是C#之一。

+0

数据总是以相同的方式构造,或者可以用/ select/from/where以不同的顺序吗? –

+0

@ChrisThompson总是相同的顺序。 – Mohayemin

+0

再次在这里你可以使用http://VeParser.codeplex.com,因为我在回答你的另一个问题时解释MDX – 000

回答

3

看起来您的用例开始变得非常复杂,您可能最好花费时间和重构工作量来使用实际的解析实用程序,而不是正则表达式。我不是C#程序员,所以我不能帮你提供很多建议,但是搜索“C#解析器库”产生了几个看起来很有希望的链接。

如果你只需要一个固定的嵌套层次,那么我认为它在技术上可以用正则表达式来完成,但它会变得讨厌。可能最简单的方法是为每个固定的嵌套层次编写一个表达式,并从顶部开始匹配它们,直到获得一个命中。丑,但可以工作。

如果顶级表达式中可以包含的嵌套表达式的数量没有限制,那么正则表达式不够强大,无法正确执行此操作,您需要查看解析实用程序。我不会试图自己写一个解析器;几乎可以肯定有可用的库可以解决大多数棘手的问题。

+0

谢谢。尽管嵌套到2或3层以上的可能性非常小,但并不确定。另外,我真的不喜欢NASTY正则表达式(我现在拥有的那个已经是一个讨厌的)。我想我应该去找一个解析器。我会让你知道,如果我找到适合我的要求的东西:) – Mohayemin

+0

@Mohaimin也许回来并编辑你的问题,你最终发现,帮助任何人在这个问题上? – Ben

+0

当然。我还没有找到任何东西。我会尽快找到答案。我在寻找。 – Mohayemin