3

谁能帮我弄清楚如何做到这一点?我目前的一个是(我在某处找到它):

/(\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7)[0-9. -]{4,14})(?:\b|x\d+)/

可检测:+86-400-660-8680

但不是这个:

  • +1 888 204 3539
  • 1-800-667-6389
  • +1-400-660-8680
  • (877) 359-6695
  • 800-692-7753

你能帮我解决这个问题吗?1个正则表达式可以检测到所有这些电话号码,或者至少我可以使用2-3个正则表达式来检测它们。

4

2 回答 2

6

因此,这是满足您需求的巨大正则表达式:

(+?(?:(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[ 98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)|((?:9 [976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]| 8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)))[0-9.-]{4,14})( ?:\b|x\d+)

在线演示

这就是我如何做到的

于 2013-05-19T10:49:23.930 回答
6

您的正则表达式在确保国家代码符合一组严格的规则时遇到了很多麻烦,但似乎并不关心它后面的内容。这意味着以下示例将与之匹配:

+86-0000
+86----0
+86-1-1-1-1

下面的正则表达式要短得多,对国家代码没有那么严格,但对电话号码的整体结构很严格。

(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *x(\d+))?\b

它与上面的示例不匹配,但会匹配这些示例:

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800 555 1234x5678
8005551234 x5678
1    800    555-5555
1----800----555-5555

对于所有这些示例,捕获组将包含以下值:

  • Group1:国家代码(例如:1 或 86)
  • Group2:区号(例如:800)
  • Group3:交易所(例如:555)
  • Group4:订户号码(例如:1234)
  • Group5:分机(例如:5678)
于 2013-05-19T14:49:04.803 回答