一个理论问题。我有一个正则表达式。我想找到与此匹配的字符串。如何获得这些字符串的最小和最大长度?
答案 0 :(得分:4)
将正则表达式转换为NFA(如果您愿意,可以使用epsilon过渡)。删除无法达到接受状态的每个州(这可能是无操作)。最小长度是到达接受状态的最短路径的长度(从开始状态使用Dijkstra,其中具有符号的转换具有长度1并且epsilon转换具有长度0)。使用双端队列,这是线性时间。如果有一个循环,则最大长度为无穷大。否则,转换图是非循环的;在非循环图中使用最长路径算法。
答案 1 :(得分:3)
您需要解析和分析正则表达式。对于经典正则表达式来说,计算长度的界限非常简单。如果你包括前瞻和后视,它可能会变得相当复杂,但问题是易处理的(我认为)。
我不知道任何可以执行此操作的库方法(在Java中)。但这并不奇怪。此功能的用例必须少之又少。