【问题标题】:Filtering an array based on number of optional RegEx matches with priorities根据具有优先级的可选 RegEx 匹配数过滤数组
【发布时间】:2016-11-27 20:36:02
【问题描述】:

假设我有一个文件数组,这些文件已从更大的文件数组中与下面代码中的表达式进行匹配。为简单起见,我会说文件数组如下:

prefix_pt1_pt3_pt5_pt6
prefix_pt1_pt4_pt5_pt6
prefix_pt1_pt3_pt4_pt6
prefix_pt1_pt5_pt6

但是文件名不一定是连续的。

我想优先考虑每个捕获组。到目前为止,我提出的代码只会对文件进行优先级排序,直到它与捕获组不匹配,因此从上面的文件中它将只选择第一个。我希望 prefix_pt1_pt3_pt4_pt6 成为我函数的结果。

const parts = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6'];

const existsRegex = new RegExp(
  regexEscape(params.folder) +
  regexEscape(prefix) +
  parts.reduce((result, part) => result + `(_${regexEscape(part)})?`, '')
);
const validFiles = scanPath(existsRegex);

if (validFiles.length) {
  const chosenFile = validFiles.reduce((file, currentFile) => {
    const matches = currentFile.match(existsRegex);
    const killFrom = matches.indexOf(undefined);

    if (killFrom > 0) matches.length = killFrom;

    if (matches.length > file.length) return matches;
    return file;
  }, []);
}

【问题讨论】:

    标签: javascript arrays regex sorting filtering


    【解决方案1】:

    假设您的文件组具有您提到的结构,并且您希望按顺序检索包含更多部分的文件(第 1 部分的优先级高于第 3 部分),您可以执行以下操作:

    1. 使用作为标准的部分数量对所选文件的数组进行排序。为了做到这一点,将文件的名称转换为数字(数字对应于每个部分的每个数字的串联)。
    2. 将关系编号文件存储在字典中。
    3. 从字典中检索文件名,键将是有序数组中的第一个元素。

    var chosenFiles = ['prefix_pt1_pt3_pt5_pt6',
        'prefix_pt1_pt4_pt5_pt6',
        'prefix_pt1_pt3_pt4_pt6',
        'prefix_pt1_pt5_pt6'
      ],
      dicc = {};
    
    function getKey(arr) {
      return arr.join('');
    }
    
    function addEntry(file, index) {
      var numberArr = file.replace(/\D+/g, '-').split('-').splice(1).map(Number);
      dicc[getKey(numberArr)] = file;
      return numberArr;
    }
    
    function sortByFileNumber(a, b) {
      var i = 0;
      while (a[i] && b[i] && a[i] >= b[i++]) {}
      return a === b ? 0 : a[i] ? -1 : 1;
    }
    
    function pickFirst(arr) {
      return dicc[getKey(arr[0])];
    }
    
    var chosenFile = pickFirst(chosenFiles
      .map(addEntry)
      .sort(sortByFileNumber));
    
    console.log(chosenFile);

    【讨论】:

    • 感谢您的回答,不幸的是我对原始问题不够清楚,因为文件部分不一定是连续的。它们的顺序/优先级在用于构建 RegExp 的数组中已经是正确的(parts),所以希望你给我的内容能帮助我找到解决方案。
    • 嗯,我的整个想法就是这样,给你一个如何解决问题的想法。很难(有时不可能)给出准确的答案(大多数时候,问题只指出了问题的一部分)。请考虑将我的答案标记为您问题的答案,如果它可以引导您解决问题。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2018-08-24
    • 2019-12-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多