有没有用Java编写的Regex优化器?

时间:2012-08-13 02:02:44

标签: java regex

我写了一个Java程序,它可以生成一系列符号,比如"abcdbcdefbcdbcdefg"。我需要的是Regex优化器,它可以产生"a((bcd){2}ef){2}g"

由于输入可能包含unicodes,例如"a\u0063\u0063\bbd",我更喜欢Java版本。

我想获得“更短”表达的原因是为了节省空间/内存。这里的符号序列可能很长。

一般来说,找到“最短”的优化正则表达式很难。所以,在这里,我不需要保证“最短”标准的那些。

3 个答案:

答案 0 :(得分:5)

我有一种讨厌的感觉,即创建匹配给定输入字符串或字符串集的最短正则表达式的问题在计算上将是“困难的”。 (与计算Kolmogorov复杂性的问题有相似之处......)

值得注意的是,abcdbcdefbcdbcdefg在匹配速度方面的最佳正则表达式可能是abcdbcdefbcdbcdefg。添加重复组可能会使正则表达式字符串更短,但它不会使正则表达式更快。实际上,除非正则表达式引擎展开重复组,否则它可能会更慢。

  

我需要这个的原因是空间/内存限制。

您是否有明确的证据证明您需要这样做?

我怀疑你不会通过这样做来节省一定数量的空间...除非输入字符串真的很长。 (如果它们很长,那么使用常规文本压缩算法来压缩字符串会得到更好的结果。)

答案 1 :(得分:2)

正则表达式不能代替压缩

不要使用正则表达式来表示字符串常量。正则表达式旨在用于匹配许多字符串中的一个。那不是你在做什么。

答案 2 :(得分:0)

我假设您正在尝试查找一个小的正则表达式来编码有限输入字符串集。如果是这样,您没有选择最佳主题。

我不能给你一个现有的程序,但我可以告诉你如何写一个。

没有规范的最低正则表单形式和determining the true minimum size regex is NP hard。当然你的集合是有限的,所以这可能是一个更简单的问题。我不得不考虑一下。

但是一个好的启发式算法将是:

  1. 构造一个接受所有字符串的普通非确定性有限自动机(NFA)。
  2. 使用子集构造将NFA转换为确定性有限自动机(DFA)。
  3. 使用标准算法最小化DFA。
  4. 使用construction from the proof of Kleene's theorem获取正则表达式。
  5. 请注意,第3步确实为您提供了唯一的最低DFA。这可能是编码字符串集的最佳方式。