Рэгулярны выраз, каб адпавядаць стандартным 10-значны нумар тэлефона

Я хачу напісаць рэгулярны выраз для шэрагу стандартнага тыпу ЗША тэлефона, які падтрымлівае наступныя фарматы:

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

дзе # азначае любы лік. Да гэтага часу я прыйшоў з наступнымі выразамі

^[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 гэта код вобласці, і гэта не з'яўляецца абавязковым.

65
магчыма дублікат stackoverflow.com/ пытанні/123559/& hellip; прапанаваны адказ распрануцца кожны ня-лічбавы сімвал. Такім чынам, вы палегчыце праверку
дададзена аўтар Arnaud Denoyelle, крыніца
@AndyLester Можа быць, OP спрабуе пазнаць. Проста таму, што праблема ўжо вырашаная, не азначае, варта адмовіцца ад магчымасці навучання ён прадстаўляе. Працуючы над рашэннем першай вучыць больш, чым проста трошкі для яго.
дададзена аўтар Ravi Thapliyal, крыніца
Для больш поўнага правільнага адказу глядзіце: stackoverflow.com/a/18626090/561710
дададзена аўтар Joe Johnston, крыніца
Сінтаксічны тэлефонныя нумары цяжка. Google выпусціла зыходны LIB адкрыты для гэтага. Частуйцеся, выкарыстоўвайце libphonenumber (або відэлец на вашым мове)
дададзена аўтар aloisdg, крыніца
Я ведаю, што гэта было некаторы час таму, але я не думаю, што коды ЗША могуць пачынацца з 1. (123) 456-7890 будзе несапраўднымі з-за вядучыя 1.
дададзена аўтар bobanahalf, крыніца

16 адказы

^(\+\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}$

Update :
As noticed by user Simon Weaver below, if you are also interested in matching on unformatted numbers just make the separator character class optional as [\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
117
дададзена
звярніце ўвагу: гэта не адпавядае 1234567890, які можа ці не можа быць праблемай. для мяне гэта было - так што я проста дадаў пасля кожнага [\ s] .- , каб зрабіць яго неабавязковым?
дададзена аўтар Simon_Weaver, крыніца
Не працуе на 123 4567 890
дададзена аўтар insidesin, крыніца
@Simon_Weaver Дзякуй за вашыя ўваходы. Я дадаў ваша заўвага да адказу.
дададзена аўтар Ravi Thapliyal, крыніца
Няма, таму што «(» у двух выпадках зусім розныя. У першым выпадку яны адзначаюць вобласць вакол код зоны (г.зн. яны не з'яўляюцца часткай тэксту, якія будуць узгоднены) і? Пасля таго, як ён тады робіць ўвесь рэгіён па жаданні. у другім выпадку, так як у дужках папярэднічае кіраўнік сімвал «\ (?» ён не адзначае пачатак вобласці і замест гэтага пачынае ўзгаднення на «(» сам характар.? пасля таго, як ён затым робіць наяўнасць «(" ў тэксце, які будзе адпавядаць жаданні.
дададзена аўтар Ravi Thapliyal, крыніца
<�Код> там ўжываецца ў дужках () , а не на лічбы. Поўнае звязанае рэгулярны выраз \ (? \ D {3} \)? . <�Код> \ d {3} паказвае, што павінна быць тры лічбы паміж () , якія (зроблены) неабавязковыя (па ).
дададзена аўтар Ravi Thapliyal, крыніца
народжаная Java радок для такіх жа, калі ласка, дапамажыце
дададзена аўтар Ashish Sahu, крыніца
Не апрацоўваць трывіяльны выпадак 1234567890 і не апрацоўваць нестандартныя, але сапраўдныя нам фарматы 123-4567890 123456-7890 або (123) 4567890 або шэраг іншых стандартаў.
дададзена аўтар Bryant Jackson, крыніца
Я не прафесіянал у рэгулярным выразе (менавіта таму я прыехаў сюды), але я не мог атрымаць гэтую абноўленую версію, каб адпавядаць «123-456-7890 '. Я толькі адпаведнай тэлефонным апаратам ЗША. Я выкарыстаў гэты абноўлены шаблон зверху : ??? ^ (\ + \ д {1,2} \ с) (? \ д {3}) [\ s .-] \ д {3} [\ s .-] \ д {4} $ І б Замяніць шаблон паставіць яго ў фармаце ЗША: \ 1 \ 2 \ 3 Дзякуй за любыя прапановы.
дададзена аўтар StewS2, крыніца
Акрамя таго, праходзіць гэтыя: (123 123 1234 і 123 123 1234)
дададзена аўтар Bob Ray, крыніца
Як вы думаеце, што знак пытання не з'яўляецца неабходным у (? \ Г {3}) часткі вашай першай лініі? Я думаю, што нам трэба адно або некалькі абставінаў і не нуль або адно ўваходжанне лічбы ў межах «(» і «)»
дададзена аўтар noobcoder, крыніца
Добра. Цяпер я разумею. Такім чынам, у гэтым выпадку, мы павінны таксама ўключаць у сябе знак пытання ў самым пачатку, як «^ (?», Каб зрабіць адкрыццё дужка коды зоны будзе неабавязковай, а?
дададзена аўтар noobcoder, крыніца
Я не зразумеў, што цалкам, але я думаю, што «? \ (» Ці азначае, што мы правяраем на адкрывалай дужкай і прама наперад? \ D {3} частка правярае нуль ці адно ўваходжанне лічбы. Дык вось я думаю, што другое пытанне знак непасрэдна перад digt правярае на лічбы, а не круглыя ​​дужкі. Ці можа быць я не правы
дададзена аўтар noobcoder, крыніца
трывае няўдачу на (224) - 612 - 1000
дададзена аўтар Jakobovski, крыніца

Ёсць шмат варыянтаў, магчымых для гэтай праблемы. Вось рэгулярны выраз, падобнае на адказ, які я раней змешчанага на 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)
  • Group2: Код (напрыклад: 800)
  • Group3: Абмен (напрыклад: 555)
  • Group4: абаненцкі нумар (напрыклад: 1234)
  • Group5: Extension (напрыклад: 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.

Для таго, каб зрабіць Area Code неабавязкова, проста дадайце знак пытання пасля таго, як для кода вобласці ў (\ D {3}).

73
дададзена
Невялікае паляпшэнне, каб дазволіць прасторы справа ад "х": ^ \ S * (: \ + (\ d {1,3})?) [- ?. (] * (\ D {3}) [-.)] * (\ D {3}) [-. ] * (\ D {4}) (?: * Х * (\ d +))? \ S * $, калі супольнасць згаджаецца, магчыма, адказ павінен быць зменены.
дададзена аўтар Jeffrey Simon, крыніца
Лепшы адказ ІМХО. Для маёй мэты \ s ў пачатку і ў канцы не патрэбныя, таму што я выкарыстоўваю для праверкі, а поле абразаецца ўжо.
дададзена аўтар Daniel, крыніца
@Kondal На жаль. Я меў на ўвазе тэкст, які вы спрабуеце адпавядаць не атрымоўваецца з гэтым рэгулярным выразам.
дададзена аўтар Francis Gagnon, крыніца
@BobRay. Я мяркую, што гэта залежыць ад выпадку выкарыстання і пра тое, як строгія вы хочаце быць з карыстацкім уводам. Рэгулярны выраз можа быць лёгка выкарыстана на вас прыклад ўваходных радкоў, каб аднавіць іх у фармаце, які вы абралі.
дададзена аўтар Francis Gagnon, крыніца
@Kondal мне цікава ўваход, які вы выкарыстоўваеце, каб зрабіць яго з ладу. Гэта, здаецца, працуе добра для мяне з 0 для кода краіны.
дададзена аўтар Francis Gagnon, крыніца
<�Уваходны тып = "тэкст" імя = клас "PHONE_NO" = "форма-кантроль" НГ-патэрн = "^ \ S * ?: [. - (] (? \ + (\ D {1,3})) * (\ d {3}) [-.)] * (\ d {3}) [-.] * (\ д {4}) (?: * х (\ D +)?) \ S * $ »толькі -Номер НГ-MaxLength = "10" />
дададзена аўтар Kondal, крыніца
Гэтая мадэль не прымае пачынаючы з нуля
дададзена аўтар Kondal, крыніца
Да гэтага часу лепшы адказ і найбольш поўна. Я таксама вельмі цаню разбіўку рэгулярных выразаў.
дададзена аўтар Bryant Jackson, крыніца
Гэтыя недапушчальныя формы праходзяць: (123 123 1234 і 123) 123 1234
дададзена аўтар Bob Ray, крыніца
@ Фрэнсіс Gagnon - справа. Я думаў пра тых выпадках, калі лік будзе апрацоўвацца ў кодзе для перадачы ў БД. У тых выпадках, дэфармаваныя лік можа прадстаўляць праблему.
дададзена аўтар Bob Ray, крыніца

Сумуючы прыклад з выкарыстаннем згаданых вышэй рашэнняў на jsfiddle. Я змяніў код трохі згодна маім патрабаванні кліентаў. Спадзяюся, што гэта дапамагае каму-то.

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

глядзі прыклад Тут

6
дададзена

Вось даволі кампактны адзін я стварыў.

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

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

Выпрабавана ў адносiнах да наступных выпадкаў выкарыстання.

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
4
дададзена
Гэта адпавядае такіх рэчаў, як (800 444-4444
дададзена аўтар Jake, крыніца

Як наконт гэтага?

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

EDIT: я забыўся пра) адзін (. EDIT 2: Атрымаў першыя 3 нумары з частку няправільна.

2
дададзена
Так, я праверыў таксама. Мы абодва даведаліся нешта. :)
дададзена аўтар crimson_penguin, крыніца
Ці будзе гэта на самай справе адпавядае зваротнай касой рысы? Я думаў, што гэта можа быць не трэба, але я не быў упэўнены на 100%.
дададзена аўтар crimson_penguin, крыніца
Там няма неабходнасці, каб пазбегнуць кропка , калі ў класе сімвалаў, таму . [-. \ \ S] павінен быць на самой справе [-. \ S] , таму што мы не хочам, каб адпавядаць ўжыць зваротны слэш.
дададзена аўтар Vedran Šego, крыніца
Вы маеце рацыю. Я проста паспрабаваў яго (я ніколі не быў патрэбны зваротны слеш перад) і [\.] і [.] як супадзенне толькі кропка, у той час як [\\.] адпавядае як кропка і зваротная касая рыса. Дзякуем Вам за заўвагу.
дададзена аўтар Vedran Šego, крыніца
Маё меркаванне пра тое, што рэгулярныя выразы, калі вы даяце камусьці рэгулярны выраз, заўсёды суправаджае яго з тлумачэннем, ці рэгулярны выраз нічога не варта. Проста маё меркаванне.
дададзена аўтар John Red, крыніца

Выразы для 1, 3 і 4 вельмі падобныя, так што вы можаце выкарыстаць:

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

Звярніце ўвагу, што ў залежнасці ад мовы і маркі выкарыстоўванага рэгулярных выразаў, то, магчыма, неабходна змясціць \ 2 замест $ 2 ці такога супадзення можа не падтрымлівацца на ўсіх.

Я не бачу добры спосаб, каб сумясціць гэта з фарматам 2, акрамя відавочнага ^ (рэгулярны выраз для 1,3,4 | рэгулярны выраз для 2) $ , які з'яўляецца выродлівым, нязграбным і робіць яго цяжка атрымаць з частак лікаў.

Што тычыцца кода рэгіёну, вы можаце дадаць (\ + \ d)? да пачатку, каб захапіць код одноразрядная вобласці (прабачце, я не ведаю, фармат вашых кодаў зон).

2
дададзена

паспрабуйце гэта для пакістанскіх карыстальнікаў .Тут гэта даволі кампактны, якую я стварыў.

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

Выпрабавана ў адносiнах да наступных выпадкаў выкарыстання.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883
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

Demo: 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
дададзена

Гэты код будзе адпавядаць ЗША ці Канадзе нумар тэлефона, а таксама пераканайцеся, што ён з'яўляецца сапраўдным кодам горада і абмен:

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

Тэст на Regex101.com

1
дададзена
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}
0
дададзена

Я скончыў з

<�Код> Const regexBase = «(: \\ + (\\ d {1,3})?) [- ?. (] * (\\ d {3}) [- ?.)] * (\\ d {3}) [-. ] * (\\ г {4,5}) (?: * (Х \\ D +))? '; Const phoneRegex = новы RegExp ( '\\ з *' + regexBase + \\ з * ',' г ');

гэта павінна было дазволіць такія рэчы, як галандскімі нумарамі, напрыклад,

+358 300 20200

0
дададзена

як наконт некалькіх лікаў з «+» і падзеліце іх з ";" "" "-" ці "" сімвалы?

0
дададзена

Пачынаючы з @ адказ Раві, я таксама ўжываць некаторыя правілы праверкі для NPA (Area) Код .

У прыватнасці:

    <�Літый> Яна павінна пачацца з 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 +

Маё рэгулярны выраз не ўключае ў сябе групоўку, каб атрымаць групы лічбы, але ён можа быць зменены, каб уключыць іх.

0
дададзена

Мабыць, самы просты ў параўнанні з некаторымі іншымі.

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

Гэта адпавядае наступнага:

<�Р> (555) 444-6789 </р>      <�Р> 555-444-6789 </р>      <�Р> 555.444.6789 </р>      <�Р> 555 444 6789 </р>
0
дададзена

Гэта больш поўны варыянт, які будзе адпавядаць столькі, колькі я магу думаць, а таксама даць вам адпаведнасць групы для краіны, рэгіёну, першы і апошні.

(?(\+?(?(\d{1,3}))(\s|-|\.)?)?(\(?(?(\d{3}))\)?(\s|-|\.)?)((?(\d{3}))(\s|-|\.)?)((?(\d{4}))))
0
дададзена

Phone number regex that i use: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

вокладкі:

  • 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
0
дададзена