是否可以根据格式对数组进行排序?
我正在查看Array方法,但没有找到。
我有一个包含所有字符串的数组,这些字符串可能包含也可能不包含电话号码。
电话号码的格式为(877) 843-2900
或877-843-2900
。
我正在尝试获取包含电话号码的数组中每个字符串的索引。
例如:
// Example input:
[
'Call today! Reach us at 314-867-5309 any day of the week.',
'Over 3,148,675,309 people trust ACME for all their road runner needs!',
'(877) 843-2900',
// ...
];
// Example output:
[0, 2, /* ... */];
这是我的尝试:
var regex1 = RegExp('/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im','g');
var str1 = 'table football, foosball, (123) 456-7890, 123-456-7890';
var array1;
while ((array1 = regex1.exec(str1)) !== null) {
console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
}
答案 0 :(得分:2)
使用正则表达式和reduce。从一个空的累加器开始,如果正则表达式匹配,则将现有索引散布到具有新索引的新数组中,否则只需返回现有索引即可。
我从上面@Tico的评论中获取了正则表达式,因为我使用的正则表达式找不到全部。
const indexes = [
'Call today! Reach us at 314-867-5309 any day of the week.',
'Over 3,148,675,309 people trust ACME for all their road runner needs!',
'(877) 843-2900'
].reduce(
(indexes, current, index) =>
/(?:\d{1}\s)?\(?(\d{3})\)?-?\s?(\d{3})-?\s?(\d{4})/g.test(current) ? [...indexes, index] : indexes,
[]
);
console.log(indexes);
Reduce以一个函数和一个可选的启动累加器作为参数。
功能
(indexes, current, index) => /(?:\d{1}\s)?\(?(\d{3})\)?-?\s?(\d{3})-?\s?(\d{4})/g.test(current) ? [...indexes, index] : indexes
接受参数,索引是收集了匹配索引的累加器,当前是当前项目,索引是当前项目的索引。它会返回一个三进制来测试正则表达式,如果不匹配则返回现有索引,如果匹配则将现有元素扩展到具有当前索引的新数组中。
[]
是保存索引的起始累加器。
答案 1 :(得分:1)
如果您知道电话号码是以下两种格式之一:(877) 843-2900
或877-843-2900
,那么您可以简单地将regex进行匹配:
(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}
但这不会识别任何其他格式的电话号码。
如果要匹配任何电话号码,则应使用libphonenumber之类的适当库。
无论如何,假设您采用了幼稚的regex路由,我们可以使用Array#reduce从输入的字符串数组中创建新的索引数组:
var strings =
[
'Call today! Reach us at 314-867-5309 any day of the week.',
'Over 3,148,675,309 people trust ACME for all their road runner needs!',
'(877) 843-2900'
];
var phoneNumbers = strings.reduce(function (indices, currentString, currentIndex) {
if (/(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}/.test(currentString)) {
indices.push(currentIndex);
}
return indices;
}, []);
console.log(phoneNumbers);