【发布时间】:2019-05-28 18:34:43
【问题描述】:
假设我有一个字符串数组,我需要它们的特定信息,有什么简单的方法可以做到这一点?
假设数组是这样的:
let infoArr = [
"1 Ben Howard 12/16/1988 apple",
"2 James Smith 1/10/1999 orange",
"3 Andy Bloss 10/25/1956 apple",
"4 Carrie Walters 8/20/1975 peach",
"5 Doug Jones 11/10/1975 peach"
];
假设我想提取日期并将其保存到另一个数组中,那么我可以制作这样的函数
function extractDates(arr)
{
let dateRegex = /(\d{1,2}\/){2}\d{4}/g, dates = "";
let dateArr = [];
for(let i = 0; i<arr.length; i++)
{
dates = /(\d{1,2}\/){2}\d{4}/g.exec(arr[i])
dates.pop();
dateArr.push(dates);
}
return dateArr.flat();
}
虽然这可行,但它很笨重并且需要pop(),因为它会返回一个数组数组,即:["12/16/1988", "16/"],另外我需要在之后调用flat()。
另一种选择是使用给定位置对字符串进行子串化,我需要知道正则表达式模式。
function extractDates2(arr)
{
let dates = [];
for(let i = 0; i<arr.length; i++)
{
let begin = regexIndexOf(arr[i], /(\d{1,2}\/){2}\d{4}/g);
let end = regexIndexOf(arr[i], /[0-9] /g, begin) + 1;
dates.push(arr[i].substring(begin, end));
}
return dates;
}
当然它使用下一个regexIndexOf()函数:
function regexIndexOf(str, regex, start = 0)
{
let indexOf = str.substring(start).search(regex);
indexOf = (indexOf >= 0) ? (indexOf + start) : -1;
return indexOf;
}
同样,这个函数也可以工作,但完成简单的提取似乎太糟糕了。有没有更简单的方法将数据提取到数组中?
【问题讨论】:
-
为什么不使用array.map?
-
@HenryHoweson
.map(单独)如果输入字符串中的日期不止一个,例如"1 Ben Howard 12/16/1988 apple 1/10/1999 ",则将不起作用,他必须在之后将其展平 -
@CertainPerformance 设置正则表达式全局标志后,它可以正常工作,而且 OP 似乎也不需要这样做。
-
@HenryHoweson 仅使用全局标志不允许(简洁)将匹配项从 multiple 字符串提取到 single 数组中,我想?你在想什么代码?
标签: javascript arrays regex