简化正则表达式或模式

rec*_*bot 5 javascript c# regex perl

今天我被问到是否有一个库来获取字符串列表并计算最有效的正则表达式以匹配这些字符串.我认为这本身就是NP完全问题,但我认为我们可以稍微改进一下范围.

如何生成和简化正则表达式以匹配网络中所有主机的一组主机?(知道我可能无法获得最有效的正则表达式.)

第一步很简单.从以下列表中;

  • appserver1.domain.tld
  • appserver2.domain.tld
  • appserver3.domain.tld

我可以连接并将其转义为

appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\.domain\.tld
Run Code Online (Sandbox Code Playgroud)

我知道如何手动简化正则表达式

appserver[123]\.domain\.tld
Run Code Online (Sandbox Code Playgroud)

从那里我可以针对完整的主机列表测试该模式,并验证它只匹配选定的3个主机.我不知道的是如何自动化简化过程.是否有任何库(Perl,Javascript或C#)或常见做法?

谢谢

更新我有一些很棒的perl模块,但我也很喜欢前端解决方案.这意味着Javascript.我一直在搜索,但没有人将perl模块移植到JS,我找不到搜索这种类型库的语言是不成功的.

dax*_*xim 9

Regexp::Assemble::Compressed/ Regexp::Assemble知道更多的技巧PreSuf.R::A附带命令行工具assemble(默认情况下未安装),这使得构建正则表达式变得更加容易.


Zai*_*aid 7

Regex::PreSuf模块旨在实现这一目标.

引用概要:

use Regex::PreSuf;

my $re = presuf(qw(foobar fooxar foozap));

# $re should be now 'foo(?:zap|[bx]ar)'
Run Code Online (Sandbox Code Playgroud)