Javascript:根据格式分析数组字符串

时间:2018-12-17 00:12:34

标签: javascript

是否可以根据格式对数组进行排序?

我正在查看Array方法,但没有找到。

我有一个包含所有字符串的数组,这些字符串可能包含也可能不包含电话号码。
电话号码的格式为(877) 843-2900877-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}.`);

}

2 个答案:

答案 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-2900877-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);