我有一组字符串,其中嵌入了数字。它们看起来像/ cal / long / 3/4/145:999或/ pa / metrics / CosmicRay / 24:4:bgp:EnergyKurtosis。我想要一个
的表达式解析器有趣的替代想法会很有用。我也很想要实现我需要的正则表达式子集以及数值约束。
谢谢!
答案 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)
http://java-source.net/open-source/parser-generators和http://catalog.compilertools.net/java.html包含此工具的目录。比较stackoverflow问题How can I parse code to build a compiler in Java?。
答案 6 :(得分:0)
如果您要去解析器路线,请查看GOLD Parsing System。它通常比YACC更好,比纯正的正则表达更清晰,并且支持Java。