以特定方式格式化电话号码?

时间:2018-10-23 13:08:41

标签: javascript regex

这不是重复项,链接的线程没有解释如何实现此目的。

我正在寻找一种特定格式的电话号码。

+ xx(x)xxx xxx xxxx

  • 国家代码。
  • 空间。
  • 括号中为零。
  • 空间。
  • 3位数字。
  • 空间。
  • 3位数字。
  • 空间。
  • 4位数字。

用户可以输入任何内容(但应始终为+61)。到目前为止,我已经尝试了以下方法。

  • 删除空格和非数字字符。
  • 如果从零开始,请删除。
  • 如果从610开始,请删除。
  • 如果从61开始,请删除。
  • 重新添加特定格式的国家/地区代码,其余电话号码为3、3、4格式。

我的问题是-有没有一种方法可以将下面的内容简化为一个表达式?

    value = value.replace(/\D/g,'');
    value = value.startsWith(0) ? value.substring(1) : value;
    value = value.startsWith('610') ? value.substring(3) : value;
    value = value.startsWith('61') ? value.substring(2) : value;
    value = '+61 (0) ' + value.replace(/\d{3,4}?(?=...)/g, '$& ');

2 个答案:

答案 0 :(得分:1)

为了扩展和解释@ splash58的注释,他们建议使用两个正则表达式进行所需的完全替换。第一个(/\D|(0+|610|61)/gi)将删除字符串中所有不需要的字符。第二个(/(\d{3})(\d{3})(\d{4})/gi)将使用剩余的数字并捕获所需的分组,以便您可以根据需要设置其格式。我强烈建议您查看他们提供的regex101链接,因为该站点将完全解释给定表达式如何以及为什么与右边的表达式匹配。

简短版本:

/\D|(0+|610|61)/gi将与任何非数字字符 OR 匹配,该字符串为0,即“ 610”或“ 61”。将该内容替换为不可删除

/(\d{3})(\d{3})(\d{4})/gi将匹配10位数的字符串,并捕获3位数,3位数和4位数的括号即括号。可以根据其位置将它们替换为标识符$1$2$3

将它们放在一起:

// look in a string and return formatted phone number only
function phone(str) {
    str = str.replace(/\D|(0+|610|61)/gi, '');
    str = str.replace(/(\d{3})(\d{3})(\d{4})/gi, '+61 (0) $1 $2 $3');
    return str;
}
console.log(phone('xgsh6101231231234vvajx'));
console.log(phone('+6101231231234'));

我还建议您首先在整个输入字符串上搜索一系列数字或空格,以减少误报。可以使用/[\d\s]+/

这样的正则表达式来完成

答案 1 :(得分:0)

您可以使用以下方式匹配数字:

^.*?\+?0*610?(\d{3})(\d{3})(\d{4})(?!\d).*$

Regex demo

并替换为:

+61 (0) $1 $2 $3

说明

  • ^断言字符串的开头
  • .*?匹配0个以上非贪婪字符
  • \+?匹配可选的加号
  • 0*610?将0+匹配为零,将61与可选的零匹配
  • (\d{3})(\d{3})(\d{4})匹配3位,3位,3位和4位数字的组
  • (?!\d)负向断言来断言以下内容不是数字
  • .*匹配0个以上的字符
  • $声明字符串的结尾

const strings = [
  "xgsh6101231231234vvajx",
  "xgsh06101231231234vvajx",
  "xgsh000006101231231234vvajx",
  "+6101231231234",
  "xgsh61012312312345vvajx",
  "xgsh5101231231234vvajx",
  "xgsh00000101231231234vvajx",
  "xgsh6143545626455345601231231234vvajx"
];
let pattern = /^.*?\+?0*610?(\d{3})(\d{3})(\d{4})(?!\d).*$/;

strings.forEach((s) => {
  console.log(s.replace(pattern, "+61 (0) $1 $2 $3"));
});