Javascript 快速检查两个正则表达式是否共享匹配项

Javascript 快速检查两个正则表达式是否共享匹配项,javascript,node.js,regex,Javascript,Node.js,Regex,假设我有一个与文件路径匹配的正则表达式列表: { "list":[ "^/foo/bar/baz/x", "^/foo/bar/baz/y" "^/foo/mon/choo$", ... "^/foo/.*" ] } 请注意,在运行时,将发生以下情况: let regexes = list.map(function(l){ return new RegExp(l); }); 我需要创建一个例程来快速检查两个

假设我有一个与文件路径匹配的正则表达式列表:

{
   "list":[
      "^/foo/bar/baz/x",
      "^/foo/bar/baz/y"
      "^/foo/mon/choo$",
      ...
      "^/foo/.*"
   ]
}
请注意,在运行时,将发生以下情况:

let regexes = list.map(function(l){
       return new RegExp(l);
});
我需要创建一个例程来快速检查两个或更多的正则表达式是否匹配相同的输入

有没有一种方法可以快速检查虚拟/潜在文件路径是否与列表中的多个正则表达式匹配

例如,正则表达式/foo/*将匹配前3项,因此表示程序中存在错误

用例:用户需要创建一个正则表达式列表,但它们必须是不共享任何匹配项的独占正则表达式

我可以用实际输入来检查,但我想知道是否有办法用理论输入来检查。(我希望后者会更快)

硬方法:我有一个文件列表。对于每个文件,我检查它是否匹配列表中的任何正则表达式。如果它与列表中的多个匹配,则抛出一个错误


硬方法的问题是,我希望在使用任何实际输入数据之前验证列表

因为您使用的是数组,所以可能会有精确正则表达式的副本,所以您可能希望使用带键的对象,或者只是设置它

除此之外,您实际上可以使用正则表达式本身来相互测试。在下面的示例中,我只检查了
*
+
,但如果您真的想全面,可以针对每个其他正则表达式运行每个正则表达式。虽然我没有这样做,因为它可能有一个很长的运行时间,但这取决于你

var列表=[
“/foo/bar/baz/x”,
“/foo/bar/baz/y”,
“/foo/mon/choo$”,
“/foo/*”
];
var error_list=[…list,“/foo/mon/choo$”;
设置=新设置(错误列表);
log(set.length==list.length,“\”,如果为false,则表示存在重复项\“”;
var regexes=[];
for(列表的var regex){
if(regex.match(/\.(\*\\+)/){
regex.push(regex);
}
}
循环:
for(正则表达式的var正则表达式){
var r=新的RegExp(“^”+regex);
对于(让列表测试){
if(test.match(r)&®ex!==测试){
控制台日志(测试,“此匹配”);
//断环;
}
}

}
请注意,因为这些是文件路径,我希望有一些聪明的方法来避免某些阶乘比较。我不认为有一种方法可以自动完成,虽然您知道如果正则表达式不包含
^
$
它们都可以匹配一个字符串:示例列表中的每个正则表达式都将匹配字符串
“/foo/bar/baz/x/foo/bar/baz/y/foo/mon/choo”
。许多正则表达式可以匹配无限多个输入字符串,因此我认为期望用户创建互斥正则表达式太严格了-如果他们这样做了,为什么会有关系?是的,让我在列表中每个项目的请求中添加^,谢谢我想知道是否有办法用理论输入来检查这一点可能有办法检查两个regexp在理论上是否都可以匹配某些输入,或者它们是否永远都不能匹配任何输入,但是解决这个一般性问题是不可能的。在每个正则表达式上进行测试并不能告诉您它们是否可能匹配其他字符串。如果从列表中删除
“/foo/*”
,则其他所有字符串都不匹配,但它们都可以对单个输入字符串进行正测试。@nnnn这取决于OP如何实现它。也许他只是在检查每个正则表达式是否匹配,idk。这就是我对问题的解释。从问题:“…检查两个或多个正则表达式是否匹配相同的输入。有没有办法快速检查一个虚拟/潜在的文件路径是否匹配列表中的多个正则表达式?”-这两个句子都谈到匹配列表中没有的内容。@nnnnnn我想,但是从编辑过的问题来看,他可能已经对它进行了一些清理,所以它实际上是一个更大表达式的一部分。因此,最后一个正则表达式是
newregexp(“^”+regex)
或任何其他替代
^
的东西。人们倾向于在回答者已经知道问题/意图的情况下提问。如果这不是正确的答案,也许你可以回答。我发誓我已经添加了这个注释=>RegExp.prototype.exec(str)处理字符串,而不是正则表达式。传递给exec的正则表达式将强制为字符串文字。