นิพจน์ทั่วไปใดที่จะตรงกับหมายเลขโทรศัพท์ระหว่างประเทศที่ถูกต้อง


113

ฉันต้องตรวจสอบว่าหมายเลขโทรศัพท์ถูกต้องหรือไม่ก่อนที่จะโทรออก โทรศัพท์สามารถไปได้ทุกที่ในโลก

นิพจน์ทั่วไปใดที่จะตรงกับหมายเลขโทรศัพท์ระหว่างประเทศที่ถูกต้อง


regex จัดการข้อผิดพลาดเช่นหมายเลขบริการไม่ได้อย่างไร เพียงลองโทรและจัดการหมายเลขที่ไม่ถูกต้องเหมือนที่คุณทำกับข้อผิดพลาดอื่น ๆ

3
แม้ว่าคุณจะถูกต้องว่า regex ไม่สามารถระบุสิ่งนี้ได้ แต่การพยายามส่งออกแต่ละครั้งจะสิ้นเปลืองเวลาและทรัพยากร การตรวจสอบหมายเลขอย่างรวดเร็วเพื่อให้แน่ใจว่าการโทรปลอมที่เห็นได้ชัดไม่ได้ปิดกั้นช่องทางที่มีค่า
Abtin Forouzandeh

1
LOL @ paxdiablo .... ฉันเดาว่า 1-800-CALL-HELP จะผ่านการทดสอบ RegExp ของคุณ ... lol
Buhake Sindi

1
บางสิ่งที่ไม่ชัดเจนในคำถามนี้คือตัวเลขจะต้องถูกต้องหากโทรจากสหรัฐอเมริกาหรือจากประเทศใด ๆ ในโลกเนื่องจากวิธีแก้ปัญหาส่วนใหญ่ด้านล่างไม่สามารถตรวจสอบหมายเลขที่ถูกต้องได้ (เช่น 0030 210 12312312 - ถูกต้อง หมายเลขกรีกเรียกจากประเทศใด ๆ ในสหภาพยุโรป)
Xeroxoid

1
@ จอนฮันนาฉันเห็นด้วยกับประเด็นหนึ่ง แต่ในทางกลับกันจากมุมมองของ UX คุณไม่คิดว่าถ้าผู้ใช้ป้อนหมายเลข 00XX ... X การทดสอบควรผ่านหรือไม่? มีหลายกรณีที่ผู้ใช้ (เช่นผู้สูงอายุ) ไม่รู้ด้วยซ้ำว่า + คืออะไรและจะพิมพ์ลงในแป้นพิมพ์ตัวเลข / โทรศัพท์ได้อย่างไร นอกจากนี้ฉันยังสามารถโต้แย้งได้ว่า 00XXX เป็นหมายเลขสากลที่ถูกต้อง (เช่นในบริบทของผู้ใช้) โดยที่ใช้รหัสออกแทน +
Xeroxoid

คำตอบ:


96
\+(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)\d{1,14}$

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

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

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


5
ดูเหมือนจะสมเหตุสมผลสำหรับฉัน ฉันจะใช้อันนี้
Robert Johnstone

17
ไม่ถูกต้อง หมายเลขโทรศัพท์ในยุโรปสามารถเริ่มต้นด้วย 0 สองเท่าโดยไม่มี + ในการเริ่มต้น ดังนั้นหมายเลขโทรศัพท์เช่น: +44 8984 1234 (สหราชอาณาจักร) ก็ใช้ได้อย่างสมบูรณ์เช่นกันหากเขียน 0044 8984 1234 ซึ่ง regexp นี้ (และคำตอบอื่น ๆ ด้วย) ไม่รองรับ
Xeroxoid

4
เมื่อรวมกับการปรับปรุง (?) และความยาวของ @ fezfox:^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
SamWhan

1
+1. จากมุมมอง UX ใช่มันอาจสมเหตุสมผลที่จะอนุญาตให้00อยู่ข้างหน้า จากมุมมองของการพัฒนาและการบำรุงรักษาฉันว่ามันเป็นเรื่องดีอย่างยิ่งที่จะบังคับให้หมายเลขทั้งหมดเริ่มต้นด้วย+หรือแม้แต่แทนที่00ด้วย+ทุกครั้งที่คุณได้รับโดยเฉพาะอย่างยิ่งเนื่องจากคนส่วนใหญ่ตระหนักถึง+รูปแบบ (ซึ่งช่องป้อนข้อมูลโทรศัพท์ระหว่างประเทศส่วนใหญ่ ต้องการอยู่ดี) นอกจากนี้ยังมีการแก้ไขแบบซับเดียวและอ่านได้ง่ายขึ้น วิธีนี้จะช่วยให้มั่นใจได้ว่าหมายเลขโทรศัพท์ทั้งหมดอยู่ในรูปแบบเดียวกันและทำให้การตรวจสอบความถูกต้องของคุณมีโอกาสเกิดข้อผิดพลาดน้อยลงมากซึ่งจะทำให้ทุกอย่างสามารถบำรุงรักษาได้มากขึ้น
milosmns

1
นอกจากนี้ใน "สมัยก่อน" ของ SMS แบบ pre-EDGE (GSM ธรรมดา) การใช้00จะไม่ส่งข้อความอย่างถูกต้องในขณะที่การเริ่มต้นด้วย a +จะใช้งานได้ในระดับสากลเสมอ เราสามารถบ้าคลั่งและทำให้มันซับซ้อนสุด ๆ ได้ แต่บางครั้งมันก็เป็นไปได้ / คุ้มค่าที่จะทิ้งข้อ จำกัด เล็กน้อยเพื่อทำให้ชีวิตของเราง่ายขึ้น :)
milosmns

66

รหัสประเทศทั้งหมดกำหนดโดย ITU regex ต่อไปนี้จะขึ้นอยู่กับ ITU-T E.164 และภาคผนวกการดำเนินงาน ITU Bulletin ฉบับที่ 930 - 15.IV.2009 ประกอบด้วยรหัสประเทศปัจจุบันและรหัสที่สงวนไว้สำหรับใช้ในอนาคต แม้ว่ามันจะสั้นลงเล็กน้อย แต่ฉันก็ตัดสินใจที่จะรวมแต่ละรหัสอย่างอิสระ

ใช้สำหรับการโทรที่มาจากสหรัฐอเมริกา สำหรับประเทศอื่น ๆ ให้แทนที่รหัสการเข้าถึงระหว่างประเทศ (011 ที่จุดเริ่มต้นของ regex) ด้วยสิ่งที่เหมาะสมสำหรับแผนการโทรของประเทศนั้นๆ

นอกจากนี้โปรดทราบว่า ITU E.164 กำหนดความยาวสูงสุดของหมายเลขโทรศัพท์ระหว่างประเทศแบบเต็มเป็น 15 หลัก ซึ่งหมายความว่ารหัสประเทศสามหลักจะทำให้เกิดตัวเลขเพิ่มเติมได้สูงสุด 12 หลักและรหัสประเทศ 1 หลักอาจมีตัวเลขเพิ่มเติมได้ถึง 14 หลัก ดังนั้น

[0-9]{0,14}$

จุดสิ้นสุดของนิพจน์ทั่วไป

ที่สำคัญที่สุด regex นี้ไม่ได้หมายความว่าตัวเลขนั้นถูกต้อง - แต่ละประเทศจะกำหนดแผนการกำหนดหมายเลขภายในของตนเอง สิ่งนี้ทำให้มั่นใจได้ว่ารหัสประเทศถูกต้อง

283 | 282 | 281 | 280 | 269 | 268 | 267 | 266 | 265 | 264 | 263 | 262 | 261 | 260 | 259 | 258 | 257 | 256 | 255 | 254 | 253 | 252 | 251 | 250 | 249 | 248 | 247 | 246 | 245 | 244 | 243 | 242 | 241 | 240 | 239 | 238 | 237 | 236 | 235 | 234 | 233 | 232 | 231 | 230 | 229 | 228 | 227 | 226 | 225 | 224 | 223 | 222 | 221 | 220 | 219 | 218 | 217 | 216 | 215 | 214 | 213 | 212 | 211 | 210 | 98 | 95 | 94 | 93 | 92 | 91 | 90 | 86 | 84 | 82 | 81 | 66 | 65 | 64 | 63 | 62 | 61 | 60 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1) [0-9] {0, 14} $


12
เกือบจะถูกต้อง ... "011" ไม่ได้เป็นส่วนหนึ่งของรหัสสากล เป็นเพียงสิ่งที่ผู้คนในสหรัฐฯต้องโทรเพื่อโทรออกต่างประเทศ คำนำหน้านั้นจะเปลี่ยนไปขึ้นอยู่กับว่าคุณโทรออกจากที่ใด ... ดังนั้นคำนำหน้านั้นจึงไม่ได้เป็นส่วนหนึ่งของหมายเลข
Gabriel Magana

3
@gmagana - ฉันพูดถึงสิ่งนั้นในคำตอบของฉัน (วรรค 2)
Abtin Forouzandeh

1
ประเด็นของฉันคือมันไม่ใช่ส่วนหนึ่งของหมายเลขโทรศัพท์ เหมือนกับการบอกว่า "1" คำนำหน้าการโทรทางไกลภายในประเทศของสหรัฐอเมริกาเป็นส่วนหนึ่งของหมายเลขโทรศัพท์
Gabriel Magana

1
@gmagana - แม้ว่าคุณจะพูดถูกว่าไม่ใช่ส่วนหนึ่งของหมายเลขโทรศัพท์ แต่ในทางเทคนิคจำเป็นต้องโทรออก
Abtin Forouzandeh

2
@ Roger Pate: ฉันใช้เวลาพอสมควรในการหาสิ่งนี้และฉันหวังว่ามันจะเป็นประโยชน์กับคนอื่น ๆ ฉันยังหวังว่าคนอื่นอาจมีทางออกที่ดีกว่า (ซึ่งเป็นสาเหตุที่ฉันไม่ได้ทำเครื่องหมายคำตอบของตัวเองว่ายอมรับ)
Abtin Forouzandeh

32

นี่คือการเพิ่มประสิทธิภาพเพิ่มเติม

\+(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)
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$

(i) อนุญาตให้ใช้คำนำหน้าระหว่างประเทศที่ถูกต้อง
(ii) ตามด้วย 9 หรือ 10 หลักโดยมีตัวคั่นประเภทใดก็ได้ (ยกเว้นระหว่างสองหลักสุดท้าย)

สิ่งนี้จะจับคู่:
+ 1-234-567-8901
+ 61-234-567-89-01
+ 46-234 5678901
+1 (234) 56 89901 +1 (234) 56-89
901
+46.234.567.8901
+1 / 234/567/8901


ฉันรู้ว่านี่เป็นคำตอบเก่า แต่มีตัวเลือกใดที่จะทำให้ 1 เป็นตัวเลือกสำหรับหมายเลขอเมริกัน
Adam Fratino

สิ่งที่คุณต้องการทำคือ (i) ทำให้ "+" เป็นทางเลือกและ (ii) รหัสสากลเป็นทางเลือก วางซะงั้น "?" หลังเครื่องหมาย + และหลังวงเล็บปิดตัวแรก
fezfox

@ManosPasgiannis ใช่ตามที่ระบุไว้ "ตามด้วย 9 หรือ 10 หลัก" มันจะปรากฏในไซปรัสที่คุณใช้ 8 ดังนั้นเพียงแค่ปรับลำดับสุดท้ายโดยลบอินสแตนซ์ของ \ d \ W * หนึ่งครั้งแล้วสร้างนิพจน์สุดท้าย (\ d {1,3})
fezfox

22

คุณสามารถใช้libphonenumberไลบรารีจาก Google

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String decodedNumber = null;
PhoneNumber number;
    try {
        number = phoneNumberUtil.parse(encodedHeader, null);
        decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164);
    } catch (NumberParseException e) {
        e.printStackTrace();
    }

2
อาจเป็นทางออกที่ดี แต่ในการตรวจสอบหมายเลขโทรศัพท์ก่อนที่จะใช้ไลบรารีนี้คุณต้องนำเข้า js จำนวนมาก ... เนื่องจาก libphonenumber.js ต้องการไลบรารีปิด ... มันไม่ใช่วิธีแก้ปัญหา: /
J. BizMai

11

สิ่งนี้จะใช้ได้กับหมายเลขระหว่างประเทศ

ค#:

@"^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$"

JS:

/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/

11

ฉันใช้อันนี้:

/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/

ข้อดี: รับรู้จุดเริ่มต้น + หรือ 011 ปล่อยให้นานเท่าที่จำเป็นและจัดการกับอนุสัญญาส่วนขยายจำนวนมาก (#, x, ext, ส่วนขยาย)


รูปแบบนี้ค่อนข้างใกล้เคียงกับรูปแบบหมายเลขโทรศัพท์ระหว่างประเทศ
feeela

9

นี่คือ regex เวอร์ชันที่ "ปรับให้เหมาะสม":

^011(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)\d{0,14}$

คุณสามารถแทนที่\ds พร้อมด้วย[0-9]ถ้าไวยากรณ์ regex \dของคุณไม่สนับสนุน



6

นิพจน์ทั่วไปของ Modified @ Eric - เพิ่มรายการรหัสประเทศทั้งหมด (รับจากxxxdepy @ Githubฉันหวังว่าคุณจะพบว่ามีประโยชน์:

/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(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)\d{4,20}$/

ใช้งานได้เหมือนมีเสน่ห์ สำหรับหมายเลขโทรศัพท์ของเนเธอร์แลนด์ด้วย ขอบคุณ!
mauvm

2

เห็นได้ชัดว่ามีหลายวิธีในการทำเช่นนี้โดยเห็นได้จากคำตอบที่แตกต่างกันทั้งหมดที่ให้มาตอนนี้ แต่ฉันจะโยนมูลค่า 0.02 ดอลลาร์ของฉันไว้ที่นี่และระบุ regex ด้านล่างซึ่งค่อนข้างสั้นกว่าเกือบทั้งหมดข้างต้น แต่อย่างละเอียดถี่ถ้วนกว่าส่วนใหญ่เช่นกัน นอกจากนี้ยังมีผลข้างเคียงที่ดีในการออกจากรหัสประเทศเป็น $ 1 และหมายเลขท้องถิ่นเป็น $ 2

^ \ + (? = \ d {5,15} $) (1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] .. ) (\ d +) $


2

ไม่มีคำติชมเกี่ยวกับคำตอบที่ยอดเยี่ยมเหล่านี้ฉันแค่ต้องการนำเสนอวิธีง่ายๆที่ฉันใช้สำหรับผู้สร้างเนื้อหาผู้ดูแลระบบของเรา:

^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$

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


1

เวอร์ชันที่เรียบง่ายสำหรับตัวเลขในยุโรปซึ่งตรงกับตัวเลขเช่น 0034617393211 แต่ยังมีความยาวเป็น 004401484172842

^0{2}[0-9]{11,}

หวังว่ามันจะช่วย: ·)


1
public static boolean validateInternationalPhoneNumberFormat(String phone) {
    StringBuilder sb = new StringBuilder(200);

    // Country code
    sb.append("^(\\+{1}[\\d]{1,3})?");

    // Area code, with or without parentheses
    sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");

    // Phone number separator can be "-", "." or " "

    // Minimum of 5 digits (for fixed line phones in Solomon Islands)
    sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");

    // 4 more optional digits
    sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");

    return Pattern.compile(sb.toString()).matcher(phone).find();
}

1
แม้ว่าข้อมูลโค้ดนี้อาจตอบคำถามได้ แต่ก็ไม่ได้ให้บริบทใด ๆ เพื่ออธิบายว่าทำไมหรืออย่างไร ลองเพิ่มประโยคหรือสองประโยคเพื่ออธิบายคำตอบของคุณ
brandonscript

1

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

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

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

คำอธิบาย:

    ^ - start of expression  
    (?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros.  
    (\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.  
    \(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.  
    ([. -]?) - optional space, dash or dot
    $ - end of expression

ตัวอย่างและคำอธิบายเพิ่มเติม - https://regex101.com/r/hTH8Ct/2/


1

ฉันได้ใช้สิ่งนี้ด้านล่าง:

^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$

รูปแบบ + CCC.NNNNNNNNNNxEEEE หรือ 00CCC.NNNNNNNNNNxEEEE

หมายเลขโทรศัพท์ต้องขึ้นต้นด้วย "+" หรือ "00" สำหรับการโทรระหว่างประเทศ โดยที่ C คือรหัสประเทศ 1-3 หลัก

N สูงถึง 14 หลัก

และ E คือส่วนขยาย (ทางเลือก)

ต้องมีเครื่องหมายบวกนำหน้าและจุดต่อท้ายรหัสประเทศ ต้องใช้อักขระ“ x” ตามตัวอักษรหากมีการระบุส่วนขยายไว้เท่านั้น



0

แผนการกำหนดหมายเลขระหว่างประเทศเป็นไปตาม ITU แผนการกำหนดหมายเลข E.164 ฉันเดาว่านั่นคือจุดเริ่มต้นของนิพจน์ทั่วไปของคุณ

ฉันจะอัปเดตสิ่งนี้หากฉันไปไหนมาไหนเพื่อสร้างนิพจน์ทั่วไปตามหมายเลข ITU E.164


0

Regex Expression นี้ใช้ได้กับหมายเลขโทรศัพท์ของอินเดียแคนาดายุโรปนิวซีแลนด์ออสเตรเลียสหรัฐอเมริกาพร้อมกับรหัสประเทศ:

"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"


0

สิ่งนี้ใช้ได้กับฉันโดยไม่มีคำนำหน้า 00, 001, 0011 ฯลฯ แม้ว่า:

/^\+*(\d{3})*[0-9,\-]{8,}/



0

ฉันสร้าง regexp สำหรับหมายเลขโทรศัพท์ในยุโรปและใช้เฉพาะกับคำนำหน้าการโทรเทียบกับความยาวของหมายเลข

const PhoneEuropeRegExp = () => {
    // eu phones map https://en.wikipedia.org/wiki/Telephone_numbers_in_Europe
    const phonesMap = {
        "43": [4, 13],
        "32": [8, 10],
        "359": [7, 9],
        "385": [8, 9],
        "357": 8,
        "420": 9,
        "45": 8,
        "372": 7,
        "358": [5, 12],
        "33": 9,
        "350": 8,
        "49": [3, 12],
        "30": 10,
        "36": [8, 9],
        "354": [7, 9],
        "353": [7, 9],
        "39": [6, 12],
        "371": 8,
        "423": [7, 12],
        "370": 8,
        "352": 8,
        "356": 8,
        "31": 9,
        "47": [4, 12],
        "48": 9,
        "351": 9,
        "40": 9,
        "421": 9,
        "386": 8,
        "34": 9,
        "46": [6, 9],
    };
    const regExpBuilt = Object.keys(phonesMap)
        .reduce(function(prev, key) {
            const val = phonesMap[key];
            if (Array.isArray(val)) {
                prev.push("(\\+" + key + `[0-9]\{${val[0]},${val[1]}\})`);
            } else {
                prev.push("(\\+" + key + `[0-9]\{${val}\})`);
            }
            return prev;
        }, [])
        .join("|");
    return new RegExp(`^(${regExpBuilt})$`);
};

alert(PhoneEuropeRegExp().test("+420123456789"))

-4

ลองทำดูฉันไม่ทราบว่ามีหมายเลขโทรศัพท์ใดที่ยาวเกิน 12:

^(00|\+){1}\d{12}$

1
นี้ตรงกับตัวเลขที่มีตรง 12 หลักรวมทั้งรหัสประเทศ นั่นเป็นสิ่งที่ผิดเพราะไม่ได้คำนึงถึงความแปรปรวนของความยาวทั่วโลก ยิ่งไปกว่านั้นความยาวสูงสุดคือ15 หลักจริงๆ
tmt

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