นิพจน์ทั่วไปเพื่อให้ตรงกับหมายเลขโทรศัพท์มาตรฐาน 10 หลัก


125

ฉันต้องการเขียนนิพจน์ทั่วไปสำหรับหมายเลขโทรศัพท์ประเภทสหรัฐอเมริกามาตรฐานที่รองรับรูปแบบต่อไปนี้:

###-###-####
(###) ###-####
### ### ####
###.###.####

โดยที่ # หมายถึงตัวเลขใด ๆ จนถึงตอนนี้ฉันคิดสำนวนต่อไปนี้

^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}

ตามลำดับ ฉันไม่ค่อยแน่ใจว่าอันสุดท้ายถูกต้องสำหรับการตรวจสอบจุดหรือไม่ ฉันต้องการทราบด้วยว่ามีวิธีใดบ้างที่ฉันสามารถเขียนนิพจน์เดียวแทนที่จะเป็น 4 นิพจน์ที่แตกต่างกันซึ่งรองรับรูปแบบต่างๆที่ฉันกล่าวถึง ถ้าเป็นเช่นนั้นฉันไม่แน่ใจว่าจะต้องทำอย่างไร และฉันจะแก้ไขนิพจน์ / นิพจน์ได้อย่างไรเพื่อให้ฉันสามารถรวมเงื่อนไขเพื่อสนับสนุนโค้ดพื้นที่เป็นส่วนประกอบเสริม สิ่งที่ต้องการ

+1 ### ### ####

โดยที่ +1 คือรหัสพื้นที่และเป็นทางเลือก


5
เป็นไปได้ที่จะซ้ำกันของstackoverflow.com/questions/123559/…คำตอบที่แนะนำคือการตัดอักขระที่ไม่ใช่ตัวเลขทุกตัว ด้วยวิธีนี้คุณทำให้การตรวจสอบง่ายขึ้น
Arnaud Denoyelle

1
ฉันรู้ว่านี่เป็นช่วงเวลาที่ย้อนกลับไปแล้ว แต่ฉันไม่คิดว่ารหัสพื้นที่ของสหรัฐอเมริกาสามารถเริ่มต้นด้วย 1. (123) 456-7890 จะไม่ถูกต้องเนื่องจากอันดับ 1 นำหน้า
bobanahalf

สำหรับคำตอบที่ถูกต้องสมบูรณ์ยิ่งขึ้นโปรดดู: stackoverflow.com/a/18626090/561710
โจจอห์นสตัน

การแยกวิเคราะห์หมายเลขโทรศัพท์เป็นเรื่องยาก Google เปิดตัว lib โอเพ่นซอร์สสำหรับสิ่งนี้ ช่วยตัวเองใช้libphonenumber (หรือส้อมในภาษาของคุณ)
aloisdg ย้ายไปที่ codidact.com

คำตอบ:


212
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

ตรงกับสิ่งต่อไปนี้

123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890

หากคุณไม่ต้องการจับคู่หมายเลขที่ไม่ใช่สหรัฐอเมริกาให้ใช้

^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

อัปเดต:
ตามที่ผู้ใช้ Simon Weaver สังเกตเห็นด้านล่างหากคุณสนใจที่จะจับคู่กับตัวเลขที่ไม่ได้จัดรูปแบบเพียงแค่ทำให้คลาสตัวคั่นเป็นตัวเลือกเป็น[\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

1
คุณคิดว่าเครื่องหมายคำถามไม่จำเป็นใน (? \ d {3}) ส่วนหนึ่งของบรรทัดแรกของคุณหรือไม่? ฉันคิดว่าเราต้องการการเกิดขึ้นอย่างน้อยหนึ่งครั้งและไม่ใช่ศูนย์หรือการเกิดหนึ่งครั้งของตัวเลขภายใน '(' และ ')'
noobcoder

2
?มีผลบังคับใช้ในวงเล็บ()ที่ไม่เกี่ยวกับตัวเลข regex \(?\d{3}\)?เกี่ยวข้องสมบูรณ์ \d{3}ระบุว่าต้องมีตัวเลขสามหลักระหว่าง()ที่ (ทำเป็น) ทางเลือก (โดย?)
Ravi Thapliyal

6
หมายเหตุ: ไม่ตรงกับ 1234567890 ซึ่งอาจเป็นปัญหาหรือไม่ก็ได้ สำหรับฉันมันเป็น - ดังนั้นฉันเพิ่งเพิ่ม?หลังจากแต่ละอัน[\s.-]เพื่อให้เป็นตัวเลือก
Simon_Weaver

1
@Simon_Weaver ขอบคุณสำหรับข้อมูลของคุณ ฉันได้เพิ่มข้อสังเกตของคุณในคำตอบแล้ว
Ravi Thapliyal

3
หากคุณต้องการหนึ่งที่หลีกเลี่ยงปัญหา @BobRay ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$กล่าวถึงการใช้งาน (โดยพื้นฐานแล้วฉันเพิ่งทำซ้ำส่วนของ RegEx ที่ครอบคลุมรหัสพื้นที่และอนุญาตให้มีตัวแปรหนึ่งตัวที่มี parens และอีกตัวที่ไม่มี)
Shrey Gupta

131

มีหลายรูปแบบที่เป็นไปได้สำหรับปัญหานี้ นี่คือนิพจน์ทั่วไปที่คล้ายกับคำตอบที่ฉันเคยวางไว้ใน SO

^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$

มันจะตรงกับตัวอย่างต่อไปนี้และอื่น ๆ อีกมากมาย:

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.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234

ไม่ว่าจะป้อนหมายเลขโทรศัพท์ด้วยวิธีใดก็ตามคุณสามารถใช้กลุ่มการบันทึกเพื่อแจกแจงหมายเลขโทรศัพท์เพื่อให้คุณประมวลผลในรหัสของคุณได้

  • Group1: รหัสประเทศ (เช่น 1 หรือ 86)
  • กลุ่ม 2: รหัสพื้นที่ (เช่น 800)
  • Group3: Exchange (เช่น 555)
  • Group4: Subscriber Number (เช่น 1234)
  • Group5: ส่วนขยาย (เช่น 5678)

นี่คือรายละเอียดของนิพจน์หากคุณสนใจ:

^\s*                #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))?   #GROUP 1: The country code. Optional.
[-. (]*             #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3})             #GROUP 2: The Area Code. Required.
[-. )]*             #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3})             #GROUP 3: The Exchange number. Required.
[-. ]*              #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4})             #Group 4: The Subscriber Number. Required.
(?: *x(\d+))?       #Group 5: The Extension number. Optional.
\s*$                #Match any ending whitespaces if any and the end of string.

ในการทำให้รหัสพื้นที่เป็นทางเลือกเพียงแค่เพิ่มเครื่องหมายคำถามหลัง (\ d {3}) สำหรับรหัสพื้นที่


8
คำตอบที่ดีที่สุด IMHO สำหรับจุดประสงค์ของฉัน\sไม่จำเป็นต้องมีจุดเริ่มต้นและจุดสิ้นสุดเนื่องจากฉันใช้สำหรับการตรวจสอบความถูกต้องและฟิลด์ถูกตัดออกไปแล้ว
Daniel

2
คำตอบที่ดีที่สุดและสมบูรณ์ที่สุด ฉันยังชื่นชมการแยกย่อยของ regex ด้วย
Bryant Jackson

@Kondal ฉันอยากรู้เกี่ยวกับอินพุตที่คุณใช้เพื่อทำให้ล้มเหลว ดูเหมือนว่าจะทำงานได้ดีสำหรับฉันโดยใช้ 0 สำหรับรหัสประเทศ
Francis Gagnon

<input type = "text" name = "phone_no" class = "form-control" ng-pattern = "^ \ s * (?: \ +? (\ d {1,3}))? [-. (] * (\ d {3}) [-.)] * (\ d {3}) [-.] * (\ d {4}) (?: * x (\ d +))? \ s * $ "เท่านั้น -numbers ng-maxlength = "10" />
Kondal

@Kondal ขออภัย ฉันหมายถึงข้อความที่คุณพยายามจับคู่ซึ่งล้มเหลวกับ regex นี้
Francis Gagnon

8

^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

ตรงกับหมายเลขโทรศัพท์เหล่านี้:

1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
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.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

ดูregex101.com


7

นี่คือสิ่งที่ค่อนข้างกะทัดรัดที่ฉันสร้างขึ้น

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

Replace: +1 \($1\) $2-$3

ทดสอบกับกรณีการใช้งานต่อไปนี้

18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
1--800--123--4567
+1 (800) 123-4567

สิ่งนี้ตรงกับสิ่งต่างๆเช่น (800444-4444
Jake

6

การเพิ่มตัวอย่างโดยใช้โซลูชันที่กล่าวถึงข้างต้นบน jsfiddle ฉันได้แก้ไขโค้ดเล็กน้อยตามความต้องการของลูกค้า หวังว่านี่จะช่วยใครบางคนได้

/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/

ดูตัวอย่างที่นี่


4

ลองใช้สำหรับผู้ใช้ชาวปากีสถานนี่คือสิ่งที่ค่อนข้างกะทัดรัดที่ฉันสร้างขึ้น

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

ทดสอบกับกรณีการใช้งานต่อไปนี้

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

4

หมายเลขโทรศัพท์ regex ที่ฉันใช้: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

ปก:

  • 18001234567
  • 1800123 4567
  • +1 800 123-4567
  • +86100123 4567
  • 1-800-123-4567
  • 1 (800) 123-4567
  • (800)123-4567
  • (800) 123-4567
  • (800) 1234567
  • 800-123-4567
  • 800.123.4567

2

นิพจน์สำหรับ 1, 3 และ 4 ค่อนข้างคล้ายกันดังนั้นคุณสามารถใช้:

^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$

โปรดทราบว่าขึ้นอยู่กับภาษาและยี่ห้อของ regexes ที่ใช้คุณอาจต้องใส่\2แทน$2ฉะนั้นการจับคู่ดังกล่าวอาจไม่ได้รับการสนับสนุนเลย

ฉันไม่เห็นวิธีที่ดีในการรวมสิ่งนี้กับรูปแบบ 2 นอกเหนือจากที่ชัดเจน ^(regex for 1,3,4|regex for 2)$ซึ่งน่าเกลียดเงอะงะและทำให้ยากที่จะเอาส่วนต่างๆของตัวเลขออกไป

สำหรับรหัสพื้นที่คุณสามารถเพิ่ม(\+\d)?ที่จุดเริ่มต้นเพื่อบันทึกรหัสพื้นที่หลักเดียวได้ (ขออภัยฉันไม่ทราบรูปแบบของรหัสพื้นที่ของคุณ)


2

แล้วเรื่องนี้ล่ะ?

^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}

แก้ไข: ฉันลืมเกี่ยวกับ () หนึ่ง แก้ไข 2: มีส่วน 3 หลักแรกผิด


ไม่จำเป็นต้องหลีกเลี่ยงจุด.เมื่ออยู่ในคลาสอักขระดังนั้น[-\.\s]ควรเป็น[-.\s]เพราะเราไม่ต้องการจับคู่แบ็กสแลช
Vedran Šego

มันจะตรงกับแบ็กสแลชจริงหรือ? ฉันคิดว่ามันอาจไม่จำเป็น แต่ก็ไม่แน่ใจ 100%
crimson_penguin

คุณพูดถูก ฉันเพิ่งลองใช้ (ฉันไม่เคยต้องการแบ็กสแลชมาก่อน) [\.]และ[.]ทั้งคู่จับคู่เฉพาะจุดในขณะที่[\\.]จับคู่ทั้งจุดและแบ็กสแลช ขอบคุณสำหรับความคิดเห็นของคุณ
เวดรานŠego

ความคิดเห็นของฉันเกี่ยวกับ regexes คือถ้าคุณให้ regex กับใครสักคนให้ใส่คำอธิบายมาด้วยเสมอไม่เช่นนั้น regex จะไร้ค่า แค่ความคิดเห็นของฉัน
John Red

2

เริ่มต้นด้วยคำตอบของ @ ราวีฉันยังใช้กฎการตรวจสอบความถูกต้องสำหรับรหัส NPA (พื้นที่)ด้วย

โดยเฉพาะอย่างยิ่ง:

  • ควรเริ่มต้นด้วย 2 (หรือสูงกว่า)
  • ไม่สามารถมี "11" เป็นตัวเลขที่สองและสาม (N11)

มีข้อ จำกัด อื่น ๆ อีกสองสามข้อรวมถึงบล็อกที่สงวนไว้ (N9X, 37X, 96X) และ 555 แต่ฉันก็ทิ้งสิ่งเหล่านั้นไว้โดยเฉพาะอย่างยิ่งเนื่องจากบล็อกที่สงวนไว้อาจเห็นการใช้งานในอนาคตและ 555 มีประโยชน์สำหรับการทดสอบ

นี่คือสิ่งที่ฉันคิดขึ้นมา:

^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

อีกวิธีหนึ่งหากคุณต้องการจับคู่ค่าว่างด้วย (หากไม่จำเป็นต้องใช้ฟิลด์นี้) คุณสามารถใช้:

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$)

กรณีทดสอบของฉันสำหรับตัวเลขที่ถูกต้อง (หลายคำตอบจาก @Francis) คือ:

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234

กรณีการทดสอบที่ไม่ถูกต้องของฉัน ได้แก่ :

(003) 555-1212     // Area code starts with 0
(103) 555-1212     // Area code starts with 1
(911) 555-1212     // Area code ends with 11
180055512345       // Too many digits
1 800 5555 1234    // Prefix code too long
+1 800 555x1234    // Invalid delimiter
+867 800 555 1234  // Country code too long
1-800-555-1234p    // Invalid character
1 (800)  555-1234  // Too many spaces
800x555x1234       // Invalid delimiter
86 800 555 1212    // Non-NA country code doesn't have +

นิพจน์ทั่วไปของฉันไม่รวมการจัดกลุ่มเพื่อแยกกลุ่มหลัก แต่สามารถแก้ไขเพื่อรวมกลุ่มเหล่านั้นได้


2

บางทีอาจเป็นวิธีที่ง่ายที่สุดเมื่อเทียบกับคนอื่น ๆ

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

ตรงกับสิ่งต่อไปนี้:

(555) 444-6789

555-444-6789

555.444.6789

555444 6789


สมบูรณ์แบบ ... ขอบคุณ (y)
Sushil Sharma

2

รหัสนี้จะตรงกับหมายเลขโทรศัพท์ของสหรัฐอเมริกาหรือแคนาดาและจะตรวจสอบด้วยว่าเป็นรหัสพื้นที่ที่ถูกต้องและการแลกเปลี่ยน:

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d

ทดสอบบน Regex101.com


2

รูปแบบ Regex เพื่อตรวจสอบความถูกต้องของหมายเลขโทรศัพท์ปกติ 10 หลักบวกรหัสระหว่างประเทศ (1 ถึง 3 หลัก) และหมายเลขต่อเสริม (จำนวนหลักใดก็ได้):

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g

การสาธิต: https://www.regextester.com/103299

รายการที่ถูกต้อง:

/* Full number */
+999 (999) 999-9999 Ext. 99999

/* Regular local phone number (XXX) XXX-XXXX */
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231

/* International codes +XXX (XXX) XXX-XXXX */
+99 1234567890
+991234567890

/* Extensions (XXX) XXX-XXXX Ext. XXX... */
1234567890 Ext 1123123
1234567890Ext 1123123
1234567890 Ext1123123
1234567890Ext1123123

1234567890 Ext: 1123123
1234567890Ext: 1123123
1234567890 Ext:1123123
1234567890Ext:1123123

1234567890 Ext. 1123123
1234567890Ext. 1123123
1234567890 Ext.1123123
1234567890Ext.1123123

1234567890 ext 1123123
1234567890ext 1123123
1234567890 ext1123123
1234567890ext1123123

1234567890 ext: 1123123
1234567890ext: 1123123
1234567890 ext:1123123
1234567890ext:1123123

1234567890 X 1123123
1234567890X1123123
1234567890X 1123123
1234567890 X1123123
1234567890 x 1123123
1234567890x1123123
1234567890 x1123123
1234567890x 1123123

1

ฉันคิดว่านิพจน์ทั่วไปนี้มีประโยชน์มากที่สุดสำหรับฉันสำหรับหมายเลขติดต่อ 10 หลัก:

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$

อ้างอิง : https://regex101.com/r/QeQewP/1

คำอธิบาย:

ใส่คำอธิบายภาพที่นี่


คุณใช้เครื่องมือเพื่อสร้างคำอธิบายนั้นหรือไม่? แบ่งปัน! ขอบคุณ
รู้จัก

@unnknown ดูเหมือนภาพหน้าจอจากตัวตรวจสอบ regex ออนไลน์เช่น regex101.com โปรดทราบว่าแนวทาง SO ระบุว่าต้องป้อนข้อความรหัสข้อมูลและข้อความแสดงข้อผิดพลาดทั้งหมดในรูปแบบข้อความไม่ใช่รูปภาพเนื่องจากข้อความในรูปภาพอาจอ่านได้ยากโดยเฉพาะบนอุปกรณ์เคลื่อนที่และต้องใช้แบนด์วิดท์มากขึ้น ไม่สามารถคัดลอกวางข้อความได้ ในกรณีนี้สีอาจเพิ่มบางอย่างไม่แน่ใจ โปรดทราบว่าโดยทั่วไป "คำตอบ" ควรมีคำอธิบายที่เป็นข้อความ Amitesh: การรวมลิงก์ไปยังไซต์นี้จะเป็นประโยชน์โดย regex ของคุณได้รับการเติมข้อมูลไว้แล้วเพื่อให้ผู้เยี่ยมชมทดลองใช้
SherylHohman

@ ไม่ทราบนี่คือลิงค์ที่สร้างภาพคล้ายกับในโพสต์นี้ วางสตริง regex ของ Amitesh แล้วคุณสามารถป้อนหมายเลขโทรศัพท์เพื่อทดสอบผลลัพธ์ได้: regex101.com/r/QeQewP/1
SherylHohman


0

นี่เป็นเวอร์ชันที่ครอบคลุมมากขึ้นซึ่งจะจับคู่ให้มากที่สุดเท่าที่ฉันจะคิดได้รวมทั้งให้คุณจับคู่กลุ่มสำหรับประเทศภูมิภาคอันดับแรกและสุดท้าย

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))


0

ฉันลงเอยด้วย

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

นี่คือการอนุญาตสำหรับสิ่งต่างๆเช่นตัวเลขดัตช์เป็นต้น

+358 300 20200


0

regex ด้านบนเป็นการแก้ไขเล็กน้อยของ @Francis Gagnon.

วัตถุประสงค์:เพื่อตรวจหารูปแบบที่เป็นไปได้ผู้ใช้สามารถแบ่งปันหมายเลขโทรศัพท์ในสหรัฐอเมริกาได้


เวอร์ชัน 1:

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

ทดสอบได้ที่นี่ Codepen: https://codepen.io/kiranbhattarai/pen/NWKMXQO

คำอธิบายของ regex: https://regexr.com/4kt5j


เวอร์ชัน 2:

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

สิ่งที่อยู่ในนั้น: กรณีทดสอบอาจเป็นส่วนหนึ่งของสตริง ในเวอร์ชันที่หนึ่งกรณีทดสอบควรเป็นจุดเริ่มต้นของบรรทัดในการทำงาน

Codepen: https://codepen.io/kiranbhattarai/pen/GRKGNGG

คำอธิบายของ regex: https://regexr.com/4kt9n


หากคุณพบรูปแบบที่สามารถล้มเหลวได้โปรดแสดงความคิดเห็นฉันจะแก้ไข

กรณีทดสอบ: ผ่าน

8 0   0  4  4  4  5   55 5
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.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234
800 (555) 1234
800(555)1234
8 0 0 5 5 5 1 2 3 4
8.0.0.5.5.5.1.2.3.4
8-0-0-5-5-5-1-2-3-4
(8)005551234
(80)05551234
8(00)5551234
8@0@0@5551234
8/0/0/5/5/5/1/2/3/4
8*0*0*5*5*5*1*2*3*4
8:0:0:5:5:5:1:2:3:4
8,0,0,5,5,5,1,2,3,4
800,555,1234
800:555:1234
1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
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.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

+86, +99 ฯลฯ ไม่ใช่หมายเลขโทรศัพท์ในสหรัฐอเมริกาอย่างแน่นอน กรณีการทดสอบอื่น ๆ ของคุณหลายกรณีดูน่าสงสัยด้วยเหตุผลอื่น ๆ
tripleee

@tripleee ให้ฉันแก้ไขฉันได้อัปเดตเป็นประเทศใด ๆ ฉันหวังว่ามันจะใช้งานได้ นอกจากนี้ฉันยังลบกรณีทดสอบที่ซ้ำกันออกด้วย
Kiran Bhattarai

0

ฉันแค่โยนคำตอบนี้ไปที่นั่นเนื่องจากมันสามารถแก้ปัญหาของฉันได้มันขึ้นอยู่กับคำตอบของ @ stormy แต่มีรหัสประเทศ 3 หลักและที่สำคัญกว่านั้นสามารถใช้ได้ทุกที่ในสตริง แต่จะไม่ตรงกันก็ไม่ใช่ นำหน้าด้วยช่องว่าง / จุดเริ่มต้นของสตริงและลงท้ายด้วยขอบเขตคำ สิ่งนี้มีประโยชน์เพื่อที่จะไม่จับคู่ตัวเลขสุ่มตรงกลาง URL หรือบางอย่าง

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.