使用JavaScript的正则表达式重新格式化美国电话号码

160

我想在Javascript中重新格式化(替换而不是验证-有许多验证参考)电话号码以供显示。以下是一些数据示例:

  • 123 4567890
  • (123) 456-7890
  • (123)456-7890
  • 123 456 7890
  • 123.456.7890
  • (空/无效)
  • 1234567890

是否有一种简单的方法使用正则表达式来完成这个任务?我正在寻找最佳方法。是否有更好的方法?

我想将号码重新格式化为:(123) 456-7890


5
你的目标格式是哪一个? - Till Helge
1
这个:(123)456-7890 - Matt K
3
我会尽量简洁地翻译以下内容:建议只保留数字字符并将其分为三个子字符串。 - Wiseguy
2
@Wiseguy请将其作为答案发布(附带示例),因为这确实是OP应该做的。 - Brian Driscoll
1
您还需要指定每个接受的格式如何映射到目标格式,如果输入为null,则这一点并不明显。除非您愿意使用额外的条件来排除该情况。 - Jon
国际号码呢? - RamPrasadBismil
17个回答

1

对于所有国际电话号码,其国家代码最多为3位数,我们可以将原始答案稍作更改,如下所示。 对于第一个匹配项,我们应该查找1-3位数字,而不是仅查找'1'。

 export const formatPhoneNumber = (phoneNumberString) => {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '');
  var match = cleaned.match(/^(\d{1,3}|)?(\d{3})(\d{3})(\d{4})$/);
   if (match) {
    var intlCode = (match[1] ? `+${match[1]} ` : '');
    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('');
  }
  return null;
}
console.log( formatPhoneNumber('16464765278') )//+1 (646) 476-5278
console.log( formatPhoneNumber('+2549114765278')) //+254 (911) 476-5278
console.log( formatPhoneNumber('929876543210') )//+92 (987) 654-3210

满足我的需求。

1
var numbers = "(123) 456-7890".replace(/[^\d]/g, ""); //This strips all characters that aren't digits
if (numbers.length != 10) //wrong format
    //handle error
var phone = "(" + numbers.substr(0, 3) + ") " + numbers.substr(3, 3) + "-" + numbers.substr(6); //Create format with substrings

1

这是一个可以接受电话号码和带分机号码的输入框。

function phoneNumber(tel) {
var toString = String(tel),
    phoneNumber = toString.replace(/[^0-9]/g, ""),
    countArrayStr = phoneNumber.split(""),
    numberVar = countArrayStr.length,
    closeStr = countArrayStr.join("");
if (numberVar == 10) {
    var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed.
} else if (numberVar > 10) {
    var howMany = closeStr.length,
        subtract = (10 - howMany),
        phoneBeginning = closeStr.slice(0, subtract),
        phoneExtention = closeStr.slice(subtract),
        disX = "x", // Change the extension symbol here
        phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed. 
        array = [phoneBeginningReplace, disX, phoneExtention],
        afterarray = array.splice(1, 0, " "),
        phone = array.join("");

} else {
    var phone = "invalid number US number";
}
return phone;
}

phoneNumber("1234567891"); // Your phone number here

1
这是一个适用于国际和美国电话号码的一行代码(为了可读性进行了格式化):
const formatUSAndInternationalNumber = (phone) => phone
  .replace(/\D/g, '')
  .replace(/(\d*)(\d{3})(\d{3})(\d{4})$/, (s, a, b, c, d) => `+${a} (${b}) ${c}-${d}`)
  .replace(/\+(1\b|\s)\s*/, '');

美国电话号码通过删除前缀+1变为国内号码。

例如:

formatUSAndInternationalNumber('1231231234')
  -> '(123) 123-1234'
formatUSAndInternationalNumber('11231231234')
  -> '(123) 123-1234'

formatUSAndInternationalNumber('491231231234')
  -> '+49 (123) 123-1234'

0
以上的解决方案都很优秀,特别是在使用Java时,遇到更多超过10位数字的数字,例如国际代码前缀或附加扩展号码。这个解决方案很基础(我是正则表达式世界的初学者),并且是针对美国电话号码设计的,仅适用于只有10个数字的字符串,可能带有一些格式字符,或者根本没有格式字符(只有10个数字)。因此,我建议仅将此解决方案用于半自动应用程序。我个人喜欢将数字存储为只有10个数字而没有格式字符,但也希望能够将电话号码转换或清理为标准格式,以便普通人和应用程序/手机可以立即识别。

我在寻找一些我可以在具有PCRE Regex功能的文本清理器应用程序中使用的东西时遇到了这篇文章(但没有Java函数)。我会在这里发布这个解决方案,供那些需要一个简单的纯Regex解决方案的人使用,它可以在各种文本编辑器、清理器、扩展器甚至一些剪贴板管理器中工作。我个人使用Sublime和TextSoap。这个解决方案是为Text Soap制作的,因为它位于菜单栏中,并提供一个下拉菜单,您可以在其中触发对光标所选内容或剪贴板中的文本进行操作的文本操作。

我的方法基本上是两个替换/搜索和替换正则表达式。每个替换搜索和替换都涉及两个正则表达式,一个用于搜索,一个用于替换。

替换/搜索和替换#1

  • 第一个替换/搜索和替换从除了10位数字以外的数字中删除非数字,并生成10位数字字符串。

第一个替换/搜索正则表达式:\D

  • 此搜索字符串匹配所有不是数字的字符。

第一个替换/替换正则表达式:""(无,甚至没有空格)

  • 将替代字段完全留空,不应包括空格。这将导致删除所有匹配的非数字字符。在进行此操作之前,您应该具有10个数字+格式字符,并且在此操作后应为10个不带格式字符的数字。

替换/搜索和替换#2

操作的第二个替换/搜索和替换部分捕获区号的组$1,捕获第二组三个数字的组$2,最后一个捕获组捕获最后一组四个数字$3。该操作的正则表达式替换部分在这些数字的捕获组之间插入了美国电话号码格式。
第二个替换/搜索正则表达式: (\d{3})(\d{3})(\d{4}) 第二个替换/替换正则表达式: \($1\) $2\-$3
  • 反斜杠\用于转义特殊字符() (表示空格)和-,因为我们将它们插入到捕获组$1$2$3中的数字之间,以便用于美国电话号码格式化。

  • 在TextSoap中,我创建了一个包括两个替换操作动作的自定义清理器,因此实际上感觉与执行脚本完全相同。我相信这个解决方案可以改进,但我预计复杂度会大大提高。如果有人想要增加这个解决方案作为学习经验,欢迎提交改进版本。


0

美国电话号码

/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/

让我们将这个正则表达式分成较小的片段,以便更容易理解。

  • /^\(?: 表示电话号码可以以可选的 ( 开头。
  • (\d{3}): 在可选的 ( 后面必须有 3 个数字。如果电话号码没有 (,则必须以 3 个数字开头。例如:(308308
  • \)?: 表示第一个 3 位数字后面可以有一个可选的 )
  • [- ]?: 接下来,电话号码可以在第一个 )(如果存在)或第一个 3 位数字后面加上可选的连字符(-)。
  • (\d{3}): 然后必须有另外 3 个数字。例如:(308)-135308-135308135
  • [- ]?: 第二组 3 位数字后,电话号码可以再次添加可选的连字符(-)。例如:(308)-135-308-135-308135-
  • (\d{4})$/: 最后,电话号码必须以四个数字结尾。例如:(308)-135-7895308-135-7895308135-78953081357895

    参考:

http://www.zparacha.com/phone_number_regex/


2
从其他网站复制内容,却不提供链接是非常不好的行为:http://www.zparacha.com/phone_number_regex/ - Till Helge
1
很抱歉,我不知道我们需要发布链接。我以为我们只需要提供对所发布的查询的答案。 - Bebu
6
抄袭他人作品并让它看起来像是你自己的作品永远都不可以。记住,下一次发布链接没有任何问题,但抄袭(尤其是不提供链接)是不对的。你总是可以选择编辑你的答案。 - Till Helge
因为作者没有回答如何按照作者的要求替换电话号码,所以被踩了。 - Brian H.
因为作者提供了链接,这个解决方案有清晰的解释并且对我有效,所以我点了赞。 - Heriberto Lugo

0
您可以使用这些函数来检查有效的电话号码并将其标准化:
let formatPhone = (dirtyNumber) => {
 return dirtyNumber.replace(/\D+/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}

let isPhone = (phone) => {
   //normalize string and remove all unnecessary characters
   phone = phone.replace(/\D+/g, '');
   return phone.length == 10? true : false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接