88

Tôi muốn viết biểu thức chính quy cho số điện thoại loại tiêu chuẩn của Hoa Kỳ hỗ trợ các định dạng sau:

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

Trong đó # có nghĩa là bất kỳ số nào. Cho đến nay tôi đã đưa ra các biểu thức sau đây

^[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}

tương ứng. Tôi không chắc chắn nếu cái cuối cùng là chính xác cho kiểm tra chấm. Tôi cũng muốn biết liệu có cách nào tôi có thể viết một biểu thức duy nhất thay vì 4 biểu thức khác nhau phục vụ cho các định dạng khác nhau mà tôi đã đề cập. Nếu vậy, tôi không chắc làm thế nào để tôi làm điều đó. Và cũng làm thế nào để tôi sửa đổi biểu thức / biểu thức để tôi cũng có thể bao gồm một điều kiện để hỗ trợ mã vùng làm thành phần tùy chọn. Cái gì đó như

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

trong đó +1 là mã vùng và nó là tùy chọn.

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

Phù hợp với những điều sau đây

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

Nếu bạn không muốn một trận đấu trên các số không phải của Hoa Kỳ, hãy sử dụng

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

Cập nhật:
Như được chú ý bởi người dùng Simon Weaver bên dưới, nếu bạn cũng quan tâm đến việc khớp trên các số chưa được định dạng, chỉ cần làm cho lớp ký tự phân cách là tùy chọn như[\s.-]?

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

    Bạn có nghĩ rằng dấu chấm hỏi là không cần thiết trong phần (? \ D {3}) của dòng đầu tiên của bạn không? Tôi nghĩ rằng chúng ta cần một hoặc nhiều lần xuất hiện và không phải là 0 hoặc một lần xuất hiện của một chữ số trong '(' và ')'

    – Dương Duy Uyên 19:54:26 22/05/2013
  • 1

    ?áp dụng trên dấu ngoặc đơn (), không phải trên các chữ số. Regex hoàn toàn liên quan là \(?\d{3}\)?. \d{3}xác định rằng phải có ba chữ số giữa các ()tùy chọn (được thực hiện) (theo ?).

    – Ngô Đức Duy 20:07:18 22/05/2013
  • 1

    lưu ý: điều này không phù hợp với 1234567890 có thể có hoặc không có vấn đề. đối với tôi nó là vậy - vì vậy tôi chỉ thêm vào ?sau mỗi cái [\s.-]để làm cho nó tùy chọn

    – Hồ Ðình Tuấn 20:59:52 12/08/2014
  • 1

    @Simon_Weaver Cảm ơn bạn đã đóng góp. Tôi đã thêm quan sát của bạn vào câu trả lời.

    – Đặng Minh Hồng 15:17:02 12/01/2015
  • 1

    Nếu bạn muốn một cái mà tránh được vấn đề @BobRay đã đề cập, hãy sử dụng ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$. (Về cơ bản, tôi chỉ sao chép phân đoạn của RegEx bao gồm mã vùng và cho phép một biến thể có parens và một biến thể không có)

    – Trịnh Ái Hồng 11:35:08 17/09/2018
96

Có nhiều biến thể có thể cho vấn đề này. Đây là một biểu thức chính quy tương tự như một câu trả lời tôi đã đặt trước đây trên SO.

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

Nó sẽ phù hợp với các ví dụ sau và nhiều hơn nữa:

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

Bất kể cách nhập số điện thoại, các nhóm chụp có thể được sử dụng để phân tích số điện thoại để bạn có thể xử lý số đó trong mã của mình.

  • Nhóm1: Mã quốc gia (ví dụ: 1 hoặc 86)
  • Nhóm2: Mã vùng (ví dụ: 800)
  • Nhóm 3: Trao đổi (ví dụ: 555)
  • Nhóm4: Số thuê bao (ví dụ: 1234)
  • Nhóm 5: Gia hạn (ví dụ: 5678)

Đây là bảng phân tích biểu thức nếu bạn quan tâm:

^\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.

Để đặt Mã vùng tùy chọn, chỉ cần thêm dấu chấm hỏi sau (\ d {3}) cho mã vùng.

|
  • 1

    câu trả lời tốt nhất IMHO. Đối với mục đích của tôi, \skhông cần thiết ở đầu và cuối, vì tôi đang sử dụng để xác thực và trường đã được cắt bớt.

    – Trịnh Hải Nam 20:31:52 26/05/2015
  • 1

    Cho đến nay câu trả lời tốt nhất và đầy đủ nhất. Tôi cũng thực sự đánh giá cao sự cố regex.

    – Hoàng Quốc Văn 13:05:42 25/05/2017
  • 1

    Mẫu này không chấp nhận bắt đầu bằng 0

    – Ngô Tú Ly 10:43:11 22/11/2017
  • 1

    @Kondal Tôi tò mò về đầu vào bạn đang sử dụng để làm cho nó thất bại. Nó dường như hoạt động tốt với tôi với 0 cho mã quốc gia.

    – Hồ Hoàng Nguyên 12:41:09 22/11/2017
  • 1

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

    – Lý Công Hiếu 13:04:17 22/11/2017
6

Thêm một ví dụ sử dụng các giải pháp được đề cập ở trên trên jsfiddle. Tôi đã sửa đổi mã một chút theo yêu cầu khách hàng của tôi. Hy vọng điều này cũng giúp được ai đó.

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

Xem ví dụ ở đây

|
4

Đây là một cái khá nhỏ gọn tôi tạo ra.

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

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

Đã thử nghiệm các trường hợp sử dụng sau đây.

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
|
3

Regex số điện thoại mà tôi sử dụng: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Bao gồm:

  • 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
|
3

Hãy thử điều này cho người dùng Pakistan. Đây là một cái khá nhỏ gọn mà tôi đã tạo.

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

Đã thử nghiệm các trường hợp sử dụng sau đây.

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

Regex patter để xác thực số điện thoại 10 chữ số thông thường cộng với mã quốc tế tùy chọn (1 đến 3 chữ số) và số mở rộng tùy chọn (bất kỳ số chữ số nào):

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

Bản trình diễn: https://www.regextester.com/103299

Các mục hợp lệ:

/* 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
|
2

Mã này sẽ khớp với số điện thoại của Hoa Kỳ hoặc Canada và cũng sẽ đảm bảo rằng đó là mã vùng và trao đổi hợp lệ:

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

Kiểm tra trên Regex101.com

|
2

Còn cái này thì sao?

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

EDIT: Tôi quên mất cái (). EDIT 2: Có phần 3 chữ số đầu tiên sai.

|
  • 1

    Không cần phải thoát dấu chấm .khi ở trong một lớp nhân vật, vì vậy [-\.\s]thực sự nên như vậy [-.\s], bởi vì chúng ta không muốn khớp với dấu gạch chéo ngược.

    – Trịnh Hải Nam 18:37:52 22/05/2013
  • 1

    Nó thực sự sẽ phù hợp với dấu gạch chéo ngược? Tôi nghĩ rằng nó có thể không cần thiết, nhưng tôi không chắc chắn 100%.

    – Hoàng Quốc Văn 18:46:16 22/05/2013
  • 1

    Bạn đúng rồi. Tôi vừa mới thử nó (tôi chưa bao giờ cần một dấu gạch chéo ngược trước đó) [\.][.]cả hai chỉ khớp với dấu chấm, trong khi [\\.]khớp cả dấu chấm và dấu gạch chéo ngược. Cảm ơn bạn đã nhận xét của bạn.

    – Ngô Tú Ly 18:55:20 22/05/2013
  • 1

    Vâng, tôi đã thử nghiệm quá. Cả hai chúng tôi đều học được điều gì đó. :)

    – Hồ Hoàng Nguyên 19:02:24 22/05/2013
  • 1

    Ý kiến ​​của tôi về regexes là, nếu bạn đang đưa ra một regex cho ai đó, hãy luôn kèm theo nó với một lời giải thích, hoặc regex là vô giá trị. Chỉ là ý kiến ​​của tôi.

    – Lý Công Hiếu 05:42:19 10/02/2017
2

Các biểu thức cho 1, 3 và 4 khá giống nhau, vì vậy bạn có thể sử dụng:

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

Lưu ý rằng, tùy thuộc vào ngôn ngữ và nhãn hiệu regexes được sử dụng, bạn có thể cần phải đặt \2thay vì $2hoặc kết hợp như vậy có thể không được hỗ trợ.

Tôi thấy không có cách nào tốt để kết hợp điều này với định dạng 2, ngoài việc rõ ràng ^(regex for 1,3,4|regex for 2)$là xấu xí, vụng về và làm cho khó có thể thoát ra khỏi các phần của các con số.

Đối với mã vùng, bạn có thể thêm (\+\d)?vào đầu để chụp mã vùng một chữ số (xin lỗi, tôi không biết định dạng mã vùng của bạn).

|
1

Có lẽ dễ nhất so với một số người khác.

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

Nó phù hợp với những điều sau đây:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

|
0

Tôi thấy biểu thức chính quy này hữu ích nhất đối với tôi đối với số liên lạc 10 chữ số:

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

Giải trình :

|
0

Tôi đã kết thúc với

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

điều này là để cho phép những thứ như số Hà Lan, ví dụ

+58 300 20200

|
0

những gì về nhiều số với "+" và tách chúng với ";" Ký tự "," "-" hoặc ""?

|
0

Đây là một phiên bản toàn diện hơn sẽ phù hợp với nhiều nhất mà tôi có thể nghĩ đến cũng như cung cấp cho bạn kết hợp nhóm cho quốc gia, khu vực, đầu tiên và cuối cùng.

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

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.