JS判断String是否有Phone个数

Determine if String Has Phone Number in JS

我目前正在构建一个聊天框,并希望对用户发送的内容进行一些快速的客户端验证。我希望能够检测用户是否在他们的消息中发送了一个 phone 数字(尽可能多的格式,但一般的美国格式是可以的)并将其替换为井号 (#)。我已经为这样的电子邮件实现了这个:

var message = 'Hi. This is my email: foo@bar.com. This is my number: (970)-555-7595.';
var emailExp = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/img;

// prints: Hi. This is my email: *********. This is my number: (970)-555-7595
console.log(message.replace(emailExp, '*********'));

我希望它看起来像这样:

var message = 'Hi. This is my email: foo@bar.com. This is my number: (970)-555-7595.';
var emailExp = /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/img;
var phoneExp = SOME_CRAZY_PHONE_REGEX;

// prints: Hi. This is my email: *********. This is my number: ##########
console.log(message.replace(emailExp, '*********').replace(phoneExp, ##########));

我有什么办法可以做到这一点?我需要它找到字符串中每个 phone 数字的所有实例,并将它们替换为井号。表达式不必太疯狂,但我希望它能匹配大多数通用的美国格式。

我确实四处寻找模式,但大多数都验证了一个完整的字符串 一个 phone 数字.我正在尝试查找并替换字符串中的所有 phone 数字。谢谢

编辑

我不打算改进我的电子邮件模式。只是 phone 数字的模式,可以在这种情况下使用:)

var phoneExp = /(\(\d{3}\))?[\s-]?\d{3}[\s-]?\d{4}/img;

这个正则表达式应该适用于美国 phone 号码,有或没有区号,机智或没有 - 在他们应该去的地方。

最后的解决方案是:

var phoneExp = /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?/img;

根据 fatcat 的决议 fatcat1111's solution here。我只需要删除开头的 ^ 字符和结尾的 $ 字符。