假设我有一个正则表达式列表,这些表达式匹配文件:
{
"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项,因此在我的程序中表示错误。
用例:用户需要创建一个正则表达式列表,但是它们必须是不共享任何匹配的独占正则表达式。
我可以用实际的输入来检查这一点,但我想知道是否也有一种方法可以用理论上的输入来检验这一点。(我希望后者能更快些)。
的“硬”方式:,我有一个文件列表。对于每个文件,我检查它是否与列表中的任何正则表达式相匹配。如果它与列表中的1以上匹配,我将抛出一个错误。
困难的方法的问题是,在使用任何实际的输入数据之前,我想验证列表。
发布于 2017-06-29 04:27:44
由于您使用的是数组,所以可能会有精确正则表达式的副本,所以您可能希望使用带键的对象,或者只是设置它。
同时,您也可以使用正则表达式来测试彼此。在下面的示例中,我只检查.*或.+,但是如果您真的想要更全面,可以针对其他正则表达式运行每个正则表达式。虽然我没有这样做,因为它可能有一个非常长的运行时间,但这取决于你。
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;
}
}
}
https://stackoverflow.com/questions/44816194
复制相似问题