C# 简化正则表达式或模式

C# 简化正则表达式或模式,c#,javascript,regex,perl,C#,Javascript,Regex,Perl,今天有人问我是否有一个库来获取字符串列表,并计算最有效的正则表达式来只匹配这些字符串。我认为这本身就是一个问题,但我认为我们可以稍微细化一下范围 如何生成和简化正则表达式,以匹配网络上所有主机的较大集合中的主机子集?(知道我可能得不到最有效的正则表达式。) 第一步很简单。从以下列表中选择 appserver1.domain.tld appserver2.domain.tld appserver3.domain.tld 我可以把它们连接起来,然后逃逸到 appserver1\.domain\.

今天有人问我是否有一个库来获取字符串列表,并计算最有效的正则表达式来只匹配这些字符串。我认为这本身就是一个问题,但我认为我们可以稍微细化一下范围

如何生成和简化正则表达式,以匹配网络上所有主机的较大集合中的主机子集?(知道我可能得不到最有效的正则表达式。)

第一步很简单。从以下列表中选择

  • appserver1.domain.tld
  • appserver2.domain.tld
  • appserver3.domain.tld
我可以把它们连接起来,然后逃逸到

appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\.domain\.tld
我知道如何手动将正则表达式简化为

appserver[123]\.domain\.tld
从那里,我可以根据完整的主机列表测试该模式,并验证它是否只匹配所选的3台主机。我不知道的是如何使简化过程自动化。是否有任何库(Perl、Javascript或C#)或常用做法

谢谢

更新我有一些很棒的perl模块,但我也希望有一个前端解决方案。这意味着Javascript。我四处搜索过,但没有人将perl模块移植到JS,我也没有找到搜索这种库的语言。

模块就是为了这样设计的

引述概要:

use Regex::PreSuf;

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

# $re should be now 'foo(?:zap|[bx]ar)'

/知道的技巧远远多于
presf
<代码>R::A随命令行工具一起提供(默认情况下未安装),这使得构建正则表达式变得更加容易。

Perl正则表达式编译器从模式中构建分支trie数据结构,这些模式在不同的备选方案中具有共同的部分:

 $ perl -Mre=debug -ce '"whatever" =~ /appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\.domain\.tld/'
Compiling REx "appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\."...
Final program:
   1: EXACT <appserver> (5)
   5: TRIEC-EXACT[123] (25)
      <1.domain.tld> 
      <2.domain.tld> 
      <3.domain.tld> 
  25: END (0)
anchored "appserver" at 0 (checking anchored) minlen 21 
-e syntax OK
Freeing REx: "appserver1\.domain\.tld|appserver2\.domain\.tld|appserver3\."...
$perl-Mre=debug-ce''whatever'=~/appserver1\.domain\.tld | appserver2\.domain\.tld | appserver3\.domain\.tld/'
正在编译REx“appserver1\.domain\.tld | appserver2\.domain\.tld | appserver3\。”。。。
最终课程:
1:精确(5)
5:TRIEC-EXACT[123](25)
25:完(0)
将“appserver”锚定在0(检查锚定)minlen 21
-e语法正常
释放REx:“appserver1\.domain\.tld | appserver2\.domain\.tld | appserver3\。”。。。

太棒了!我真的希望这也存在于JS中。你能把编译后的正则表达式作为字符串提取出来吗?