正则表达式的替代方案

时间:2009-02-05 02:35:28

标签: java regex parsing

我有一组字符串,其中嵌入了数字。它们看起来像/ cal / long / 3/4/145:999或/ pa / metrics / CosmicRay / 24:4:bgp:EnergyKurtosis。我想要一个

的表达式解析器
  • 易于使用。举几个例子,某人应该能够形成一个新的表达。我希望最终用户能够形成新的表达式来查询这组字符串。一些潜在用户是软件工程师,其他人是测试人员,一些是科学家。
  • 允许限制数字。类似于'/ cal / long / 3/4/143:#> 100&< 1110'来指定带有'/ cal / long / 3/4/143:'的字符串前缀,然后是(100)之间的数字,1110)是预期的。
  • 支持'|'和。因此表达式'/ cal /(long | short)/ 3/4 / '将匹配'/ cal / long / 3/4/1:2'以及'/ cal / short / 3/4 / 1:2'
  • Java实现可用或易于用Java实现。

有趣的替代想法会很有用。我也很想要实现我需要的正则表达式子集以及数值约束。

谢谢!

7 个答案:

答案 0 :(得分:7)

没有理由重新发明轮子!正则表达式引擎的核心是建立在数学和计算机科学的坚实基础之上;我们今天继续使用它们的原因是它们主要是合理的,并且在可预见的将来不会得到改善。

如果您确实找到或创建了一些仅涵盖Regex可能的子集的替代解析语言,您很快就会有一个用户要求一个可以在Regex中表达的概念,但您的味道很明显。花时间解决尚未解决的问题!

答案 1 :(得分:4)

我倾向于同意Rex M,尽管你对数值约束的第二个要求使事情复杂化。除非你只允许非常基本的约束,否则我不知道在正则表达式中简洁地表达它的方法。如果有这样的方式,请忽略我的其余答案并遵循其他建议。 :)

你可能想要考虑一个解析器生成器 - 比如经典的lex和yacc。我对Java选择并不熟悉,但这里有一个列表:

http://java-source.net/open-source/parser-generators

如果您不熟悉,标准方法是首先创建一个lexer,将您的字符串转换为令牌。然后你将那些令牌传递给一个解析器,将你的语法应用于它们并吐出某种结果。

在您的情况下,我设想解析器导致正则表达式和其他条件的组合。对于您的数值约束示例,它可能会为您提供正则表达式\/cal/long/3/4/143:(\d+)\和一个约束以应用于第一个分组(\d+部分),该分组要求数字介于100和1100之间。您将然后将RE应用于候选人的字符串,并将约束应用于那些候选人以找到您的匹配。

这是一个非常复杂的方法,所以希望有一种更简单的方法。我希望至少能给你一些想法。

答案 2 :(得分:4)

Java约束是一个严重的约束。我建议使用解析组合器,但您必须使用类而不是函数将想法转换为Java。关于这个主题有很多很多论文;最容易接近的是Graham Hutton's Higher-Order Functions for Parsing。 Hutton的方法使得根据数字大小等条件决定成功或失败特别容易,如您在示例中所示。

答案 3 :(得分:2)

不幸的是,并非所有程序员(包括我自己)都熟悉RegEx。这通常意味着我们最终会编写自己的字符串解析逻辑,否则RegEx可以很好地为我们服务。

这并不总是坏事。在某些情况下,可以编写一个更优雅,更易读并满足问题域精确需求的DSL(一类,一组紧密结合的方法)。麻烦的是,它可能需要数十次迭代才能将问题提炼成简单直观的DSL。只有当DSL在应用程序或大型社区中被广泛使用时才会出现这种麻烦。不要为只偶尔出现的问题写出优雅的解决方案。

答案 4 :(得分:0)

实际上你所描述的是Java Pattern匹配器。恰好使用正则表达式作为其语言。

答案 5 :(得分:0)

答案 6 :(得分:0)

如果您要去解析器路线,请查看GOLD Parsing System。它通常比YACC更好,比纯正的正则表达更清晰,并且支持Java。

http://goldparser.org/about/how-it-works.htm