将字符串数组减少到最小的正则表达式值

Posted

技术标签:

【中文标题】将字符串数组减少到最小的正则表达式值【英文标题】:Reduce array of strings to smallest regexable value 【发布时间】:2017-05-13 01:13:00 【问题描述】:

我正在开发一个节点模块,该模块将文件上传到 s3 并在上传文件后执行云端失效,但考虑到失效不是免费的,我想将上传的失效文件路径减少到可能的最小正则表达式值,例如

[
  'library-latest-v2.min.js',
  'library-latest-v2.min.js.map',
  'library-latest-v2.test.min.js',
  'library-latest-v2.test.min.js.map'
]

会变成library-latest-v2*

任何想法如何去编写一个函数来做到这一点?没有太多运气谷歌搜索。如果它可以处理多种变化,例如

[
  'library-latest-v2.min.js',
  'library-latest-v2.min.js.map',
  'other-library-v3.min.js',
  'other-library-v3.min.js.map'
]

会减少到['library-latest-v2*', 'other-library-v3*'],但不确定这有多大可能

【问题讨论】:

匹配第一个 . 的所有内容,然后过滤数组以获取匹配的字符串。如果找到结果,请将其删除并将* 添加到原始文件中。如果我理解你的问题,那就是。 我宁愿选择.map(用于将元素中的.*替换为*),然后是.uniq 确保你也匹配.,否则你可能会遇到v2v23等的冲突 【参考方案1】:

假设您的 Array 元素采用给定格式。

试试这样的。

var arr = [
  'library-latest-v2.min.js',
  'library-latest-v2.min.js.map',
  'other-library-v3.min.js',
  'other-library-v3.min.js.map'
];

var reducedArr = [];
var temp;
arr.forEach(function(item)
   temp = item.split('.')[0] + "*";
   if(reducedArr.indexOf(temp) < 0) reducedArr.push(temp);
);

console.log(reducedArr);

另一个没有任何变量的解决方案

var arr = [
  'library-latest-v2.min.js',
  'library-latest-v2.min.js.map',
  'other-library-v3.min.js',
  'other-library-v3.min.js.map'
].map(function(item)
  return item.split('.')[0] + "*";
).filter(function(item, index, self)
  return self.indexOf(item) === index;
);

console.log(arr);

【讨论】:

喜欢第二种解决方案:)【参考方案2】:

给你:

let a = [
    'library-latest-v2.min.js',
    'library-latest-v2.min.js.map',
    'other-library-v3.min.js',
    'other-library-v3.min.js.map'
];


let b = [];

for (let i of a) 
    let m = i.match(/[^.]*/).pop() + '*';

    if (b.indexOf(m) === -1) 
        b.push(m);
     

【讨论】:

以上是关于将字符串数组减少到最小的正则表达式值的主要内容,如果未能解决你的问题,请参考以下文章

javascript - 将字符串与正则表达式数组匹配

CALL/APPLY一些编程基础以及一些基础知识正则

JavaScript正则表达式

从正则表达式(RE)到最小确定性有限状态自动机(DFA)

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?