从电话号码中解析出区号

4

我有一份电话号码列表,其格式多种多样,例如:(212)-555-1234212-555-12342125551234

使用 JavaScript,从这些字符串中提取区号的最佳方法是什么?


1
需要更多关于电话号码所在数据的上下文信息。每行是否只有一个电话号码?电话号码是否嵌入在文本中?单行可能有多个电话号码吗?也许您可以提供一些原始数据示例,以便从中提取区号。 - David
以下的答案回答了我的问题,我希望我能接受所有正确的答案 :) - Gershon Herczeg
5个回答

8

首先,去掉所有不是数字的字符,得到纯数字。然后,通过切片获取前三个数字:

return myString.replace(/\D/g,'').substr(0, 3);

这是最好的选择,因为如果您需要在任何时候对电话号码进行验证,这比正则表达式更易于维护。而且它也更易读。 - FrankieTheKneeMan
@FrankieTheKneeMan,它使用了一个正则表达式。事实上,它使用了一个正则表达式和两个字符串方法。到底有什么使它比正则表达式更易于维护的呢? - canon
1
@canon - 任何美国电话号码都可以表示为一系列10个数字。所有其他格式(空格、连字符、括号等)仅用于人类可读性。虽然这使用了一个正则表达式,但它只使用它来将信息削减到最小所需量。这也使代码更易于维护,因为它既稍微容易阅读,又更具可扩展性。 - FrankieTheKneeMan

5

获取前3个连续数字的方法是...

/[0-9]{3}/.exec("(212)-555-1234")[0]

示例(演示):

console.log(/[0-9]{3}/.exec("(212)-555-1234")[0]); // 212
console.log(/[0-9]{3}/.exec("212-555-1234")[0]); // 212
console.log(/[0-9]{3}/.exec("2125551234")[0]);​ // 212

1
或者使用 /\d{3}/.exec("(212)-555-1234")[0] 来节省更多字符。 - Eli

2

1

正则表达式'^\(*(\d{3})'应该可以解决问题。从匹配中获取第一组。

这里的^将从开头开始匹配,\d{3}将匹配3个数字。\(*将匹配可选的起始括号。您不需要关心区号后面的下一个数字或符号。


这不是有效的。首先,由于使用了\\d而不是\d,它将无法匹配这些字符串的任何部分。即使修复了这个问题,它仍然会匹配555123 - DeanOC
1
请使用正则表达式字面量,它们比正则表达式字符串更易于阅读。 - Bergi
1
@DeanOC 额外的转义字符被用来转义转义字符本身。我去掉了它以避免混淆。你的第二部分是错误的。我使用 ^ 从开头匹配。语法可能有一些问题,但在概念上,它只会匹配前三个数字 - Yogendra Singh
我会使用问号而不是星号,但是没错,这样做可以实现。 - FrankieTheKneeMan
我的错,测试时可能没有复制^。但是当用于(212)-555-1234时,这个正则表达式是不正确的,因为它包括了开括号在内的匹配。 - DeanOC
显示剩余3条评论

1

取一个10位数的前三个数字,或者以1开头的11位数中的第一个1后面的前三个数字。这假设您的域是美国电话号码。


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