【问题标题】:Recursive match with regular expression递归匹配正则表达式
【发布时间】:2011-10-10 04:08:26
【问题描述】:

我需要用以下字符串分割一个表达式:

'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# 的。

【问题讨论】:

  • 数据的结构总是相同的,还是 with/select/from/where 的顺序不同?
  • @ChrisThompson 总是相同的顺序。
  • 再次在这里您可以使用VeParser.codeplex.com,正如我在回答您解析MDX的另一个问题时所描述的那样

标签: c# regex recursive-regex


【解决方案1】:

看起来您的用例开始变得足够复杂,您最好投入时间和重构工作以使用实际的解析实用程序,而不是正则表达式。我不是 C# 程序员,因此我无法为您提供太多建议,但是在谷歌上搜索“C# 解析器库”会产生一些看起来很有希望的链接。

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

如果顶级表达式中可以包含的嵌套表达式的数量没有限制,那么正则表达式的功能不足以正确执行此操作,您需要查看解析实用程序。我不会尝试自己编写解析器。几乎可以肯定有可用的库可以为您解决大部分棘手的问题。

【讨论】:

  • 谢谢。虽然嵌套到2、3层以上的概率非常小,但也不确定。另外,我真的不喜欢 NASTY 正则表达式(我现在拥有的那个已经很讨厌了)。我想我应该去找一个解析器。如果我找到适合我要求的东西,我会告诉你的:)
  • @Mohaimin 也许回来编辑你的问题,你最终找到了什么,以帮助任何遇到这个问题的人?
  • 当然。我还没有找到任何东西。我一找到东西就去做。我正在寻找。
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多