正则表达式的替代方案

我有一组字符串,其中嵌入了数字。 它们看起来像/ 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实现是否可用或易于实现。

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

谢谢!

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

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

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

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

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

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

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

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

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

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

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

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

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

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