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

时间:2017-06-29 04:07:46

标签: 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);
});

我需要创建一个例程来快速检查两个或多个正则表达式是否匹配相同的输入。

有没有办法快速检查虚构/潜在文件路径是否与列表中的多个正则表达式匹配?

例如,正则表达式/foo/.*将匹配前3个项目,因此这表示我的程序中存在错误。

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

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

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

困难的问题是我想在使用任何实际输入数据之前验证列表。

1 个答案:

答案 0 :(得分:0)

由于您正在使用数组,因此可能会复制正确的正则表达式,因此您可能希望使用带有键的对象,或者只是设置它。

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



var list = [
  "/foo/bar/baz/x",
  "/foo/bar/baz/y",
  "/foo/mon/choo$",
  "/foo/.*"
];

var error_list = [...list, "/foo/mon/choo$"];
let set = new Set(error_list);

console.log(set.length === list.length, "\"if false it means there's duplicates\"");

var regexes = [];

for (var regex of list){
  if (regex.match(/\.(\*|\+)/)){
    regexes.push(regex);
  }
}

loop:
for (var regex of regexes){
  var r = new RegExp("^"+regex);
  for (let test of list){
    if (test.match(r) && regex !== test){
      console.log(test, "this matched");
      // break loop;
    }
  }
}