正则表达式的替代方案

Sea*_*iff 11 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中实现.

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

谢谢!

Rex*_*x M 7

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

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

  • 正则表达式在数学上是合理且快速的.但他们在易用性和可维护性方面确实很难.在这方面,他们是纯粹的邪恶.这就是为什么有理由重新发明. (22认同)
  • 我不同意.正则表达式至少简明扼要,难以阅读.我相信这是一个观点,但我已经学会了它们,没有学过它们,重新学习它们. (9认同)
  • @RexM:您有 5 秒钟的时间阅读一行正则表达式并告诉我它的作用。你准备好了吗?去:`(&lt;)?(\w+@\w+(?:\.\w+)+)(?(1)&gt;)`。阅读正则表达式就像阅读汇编:是的,这是可能的,但不,你不应该这样做。我很惊讶还没有建立在 Regex 之上的更高、更易读的语言。 (8认同)
  • @BT,对于任何说不熟悉的语言都可以说. (3认同)
  • 看一下lex/yacc如何使用从命名组件构建的正则表达式.与在一个可怕的perl风格的regexp中编写所有内容相比,这是一种更好的方式. (3认同)
  • 我必须在这里支持 BT 和 Yar 的观点。我非常了解正则表达式,但我仍然认为它们几乎是有史以来最糟糕的语言——甚至比 Perl 本身更糟糕,在实际维护任何重要代码方面。 (2认同)

Mat*_*las 4

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

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

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

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

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

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