从'1y2m3d'、'2m3d'、'1y3d'、'1y'或'3d'等字符串计算天数

Calculate number of days from string like '1y2m3d', '2m3d', '1y3d', '1y' or simply '3d'

我想在 javascript 中为我的网格创建一些过滤系统。我的问题是我有一个包含年数、月数和天数的字符串。我想将此字符串转换为天数格式。 IE。 1y1m2d = 1*365+1*30+21y2d = 1*365+2 或类似的其他组合。

我不确定如何处理这个问题。我试图为此创建一个正则表达式,但是我不知道如何区分组是年份还是月份等等。

正则表达式看起来像这样 - /(\d+y)?(\d+m)?(\d+d)?/ 但是对于这个解决方案,问题是我无法知道组是否是年、月等。

我尝试的第二个解决方案是使用 .replace 然后通过 math.eval() 传递它,但事实证明这对我不起作用,我不确定为什么。

let result = stringFormat.replace(/y|m|d/, function (x) {
  return x === 'y' ? '*365' : x === 'm' ? '*12' : '*30';
});

你怎么看这件事?这里最好的方法是什么?谢谢。

你可以使用

const stringFormat = '1y1m2d'; 
let result = stringFormat.replace(/[ymd]/g, function (x, index, source) {
  return (x === 'y' ? '*365' : x === 'm' ? '*30' : '')+(index !== source.length-1 ? '+' : '');
});
console.log(result) // => 1*365+1*30+2

备注:

  • /[ymd]/g 匹配字符串
  • 中出现的所有 ymd
  • 回调函数中使用了三个参数:x代表匹配值,index是开始匹配位置,source是输入字符串值
  • 如果匹配到y,则替换为*360,如果匹配不在字符串末尾,则替换为+,如果匹配到m,则替换是*30+,如果匹配到d,则不加乘数。
  • (index !== source.length-1 ? '+' : '') 检查匹配是否在字符串的末尾,并在必要时添加 +。它是这样工作的,因为匹配始终是单个字符。