正则表达式的替代项

2022-09-03 06:37:16

我有一组嵌入了数字的字符串。它们看起来像 /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中实现。

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

谢谢!


答案 1

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

如果您确实找到或创建了一些替代解析语言,该语言仅涵盖了正则表达式可以实现的一部分可能性,那么您很快就会让用户要求一个可以用正则表达式表示的概念,但您的风格只是简单地省略了。把时间花在解决尚未解决的问题上!


答案 2

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

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

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

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

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

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