有没有用Java编写的正则表达式优化器?

有没有用Java编写的正则表达式优化器?,java,regex,Java,Regex,我编写了一个Java程序,可以生成一系列符号,比如“abcdbcdeffbcdbcdefg”。我需要的是正则表达式优化器,它可以产生“a((bcd){2}ef){2}g” 由于输入可能包含Unicode,如“a\u0063\u0063\bbd”,我更喜欢Java版本 我想要得到“更短”表达式的原因是为了节省空间/内存。这里的符号序列可能很长 一般来说,要找到“最短”的优化正则表达式是很困难的。所以,在这里,我不需要保证“最短”标准的标准 我有一种不愉快的感觉,即创建与给定输入字符串或字符串集匹配

我编写了一个Java程序,可以生成一系列符号,比如
“abcdbcdeffbcdbcdefg”
。我需要的是正则表达式优化器,它可以产生
“a((bcd){2}ef){2}g”

由于输入可能包含Unicode,如
“a\u0063\u0063\bbd”
,我更喜欢Java版本

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


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

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

还值得注意的是,就匹配速度而言,
abcdbcdefbcdbcdefg
的最佳正则表达式可能是
abcdbcdefbcdbcdefg
。添加重复组可能会使正则表达式字符串变短,但不会使正则表达式变快。事实上,除非正则表达式引擎展开重复组,否则速度可能会较慢

我之所以需要它是因为空间/内存限制

你有明确的证据证明你需要这样做吗


我怀疑这样做不会节省大量的空间。。。除非输入字符串很长。(如果它们很长,那么使用正则文本压缩算法压缩字符串会得到更好的结果。)

正则表达式不能替代压缩


不要使用正则表达式来表示字符串常量。正则表达式设计用于匹配多个字符串中的一个。这不是您正在做的。

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

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

没有规范的最小正则表达式形式和。当然,你的集合是有限的,所以这可能是一个更简单的问题。我得考虑一下

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

  • 构造一个接受所有字符串的平凡的非确定性有限自动机(NFA)
  • 使用子集构造将NFA转换为确定性有限自动机(DFA)
  • 使用标准算法最小化DFA
  • 使用以获取正则表达式

  • 请注意,步骤3确实为您提供了唯一的最小DFA。这可能是对字符串集进行编码的最佳方式。

    您基本上希望压缩输入字符串并输出类似正则表达式的格式?请定义“正则表达式优化器”。根据您的示例猜测您的需要,我建议使用速度极快的
    return“*”为什么要压缩(您称之为“优化”)正则表达式?谁在乎呢?正则表达式不会运行得更快,事实上它在压缩时可能会运行得更慢。是的,我认为标题不合适,请更改。我完全同意你的看法。我之所以需要它是因为空间/内存限制。所有等价的正则表达式都应编译为相同的NFA和DFA,但无法确定这是否与他的实际需要有关。它似乎与正则语言的等效。他试图表示一组字符串。正则表达式是一种很好的方法。@Gene:他的例子表明他试图表示一个字符串。我相信一组经过分解的字符串正好是常量。使用指针和字符串api可以让您了解差异,从那里很容易。正则表达式中有太多的开销,它在有限集上没有用处@此外,如果在压缩之前将字符串连接在一起,文本压缩在字符串集上也能很好地工作。如果在所有变量重复中,唯一的方法是根据正则表达式的构造进行人工解释。我认为这大约是100%的时间,否则就不需要正则表达式。您的解决方案是一种选择。问题是字符串很长。我不想将所有字符串直接存储到文件中。