Regex thêm dấu gạch ngang vào số điện thoại python

Bạn muốn xác định xem người dùng đã nhập số điện thoại ở Bắc Mỹ theo định dạng phổ biến, bao gồm cả mã vùng địa phương. Các định dạng này bao gồm

[$1]●$2-$3
0,
[$1]●$2-$3
1,
[$1]●$2-$3
2,
[$1]●$2-$3
3,
[$1]●$2-$3
4 và tất cả các kết hợp có liên quan. Nếu số điện thoại hợp lệ, bạn muốn chuyển đổi nó sang định dạng chuẩn,
[$1]●$2-$3
5, để bản ghi số điện thoại của bạn nhất quán

Một biểu thức chính quy có thể dễ dàng kiểm tra xem người dùng đã nhập thứ gì đó giống số điện thoại hợp lệ hay không. Bằng cách sử dụng các nhóm chụp để ghi nhớ từng bộ chữ số, bạn có thể sử dụng cùng một biểu thức chính quy để thay thế văn bản chủ đề bằng định dạng chính xác mà bạn muốn

^\[?[[0-9]{3}]\]?[-.●]?[[0-9]{3}][-.●]?[[0-9]{4}]$
Tùy chọn Regex. Không có hương vị Regex. . NET, Java, JavaScript, PCRE, Perl, Python, Ruby

[$1]●$2-$3
Hương vị văn bản thay thế. . NET, Java, JavaScript, Perl, PHP
[\1]●\2-\3
Hương vị văn bản thay thế. Trăn, Hồng ngọc

Regex regexObj =
    new Regex[@"^\[?[[0-9]{3}]\]?[-. ]?[[0-9]{3}][-. ]?[[0-9]{4}]$"];

if [regexObj.IsMatch[subjectString]] {
    string formattedPhoneNumber =
        regexObj.Replace[subjectString, "[$1] $2-$3"];
} else {
    // Invalid phone number
}

[$1]●$2-$3
0

Các ngôn ngữ lập trình khác

Xem Bí quyết 3. 5 và 3. 15 để được trợ giúp triển khai biểu thức chính quy này với các ngôn ngữ lập trình khác

Biểu thức chính quy này khớp với ba nhóm chữ số. Nhóm đầu tiên có thể tùy chọn được đặt trong dấu ngoặc đơn và hai nhóm đầu tiên có thể tùy ý theo sau với lựa chọn ba dấu phân cách [dấu gạch nối, dấu chấm hoặc dấu cách]. Bố cục sau chia biểu thức chính quy thành các phần riêng lẻ, loại bỏ các nhóm chữ số thừa

[$1]●$2-$3
1

Hãy xem xét kỹ hơn từng phần này

[$1]●$2-$3
6› và ‹
[$1]●$2-$3
7› ở đầu và cuối của biểu thức chính quy là một loại siêu ký tự đặc biệt được gọi là mỏ neo hoặc khẳng định. Thay vì khớp văn bản, các xác nhận khớp với một vị trí trong văn bản. Cụ thể, ‹
[$1]●$2-$3
6› khớp ở đầu văn bản và ‹
[$1]●$2-$3
7› ở cuối. Điều này đảm bảo rằng regex số điện thoại không khớp trong văn bản dài hơn, chẳng hạn như
[\1]●\2-\3
0

Như chúng ta đã thấy nhiều lần, dấu ngoặc đơn là ký tự đặc biệt trong biểu thức chính quy, nhưng trong trường hợp này, chúng tôi muốn cho phép người dùng nhập dấu ngoặc đơn và để biểu thức chính quy của chúng tôi nhận ra chúng. Đây là một ví dụ trong sách giáo khoa về nơi chúng ta cần dấu gạch chéo ngược để thoát khỏi một ký tự đặc biệt để biểu thức chính quy coi nó là đầu vào bằng chữ. Do đó, các chuỗi ‹

[\1]●\2-\3
1› và ‹
[\1]●\2-\3
2› bao quanh nhóm chữ số đầu tiên khớp với các ký tự trong ngoặc đơn. Cả hai đều được theo sau bởi một dấu chấm hỏi, khiến chúng trở thành tùy chọn. Chúng tôi sẽ giải thích thêm về dấu chấm hỏi sau khi thảo luận về các loại mã thông báo khác trong biểu thức chính quy này

Các dấu ngoặc đơn xuất hiện mà không có dấu gạch chéo ngược đang chụp các nhóm và được sử dụng để ghi nhớ các giá trị phù hợp bên trong chúng để có thể gọi lại văn bản phù hợp sau này. Trong trường hợp này, các tham chiếu ngược đến các giá trị đã chụp được sử dụng trong văn bản thay thế để chúng tôi có thể dễ dàng định dạng lại số điện thoại khi cần

Hai loại mã thông báo khác được sử dụng trong biểu thức chính quy này là các lớp ký tự và bộ định lượng. Các lớp ký tự cho phép bạn ghép bất kỳ ký tự nào trong một tập hợp ký tự. ‹

[\1]●\2-\3
3› là lớp ký tự khớp với bất kỳ chữ số nào. Tất cả các hương vị biểu thức chính quy được đề cập trong cuốn sách này bao gồm lớp ký tự tốc ký ‹
[\1]●\2-\3
4› cũng khớp với một chữ số, nhưng ở một số hương vị ‹
[\1]●\2-\3
4› khớp với một chữ số từ bộ ký tự hoặc tập lệnh của bất kỳ ngôn ngữ nào, đây không phải là điều chúng tôi muốn ở đây. Xem Công thức 2. 3 để biết thêm thông tin về ‹______84›

[\1]●\2-\3
7› là một lớp ký tự khác, cho phép bất kỳ một trong ba dấu phân cách. Điều quan trọng là dấu gạch nối phải xuất hiện đầu tiên trong lớp ký tự này, bởi vì nếu nó xuất hiện giữa các ký tự khác, nó sẽ tạo ra một phạm vi, như với ‹
[\1]●\2-\3
3›. Một cách khác để đảm bảo rằng dấu gạch nối bên trong một lớp ký tự khớp với phiên bản chữ của chính nó là thoát nó bằng dấu gạch chéo ngược. ‹
[\1]●\2-\3
9› do đó tương đương

Cuối cùng, bộ định lượng cho phép bạn lặp lại mã thông báo hoặc nhóm. ‹

Regex regexObj =
    new Regex[@"^\[?[[0-9]{3}]\]?[-. ]?[[0-9]{3}][-. ]?[[0-9]{4}]$"];

if [regexObj.IsMatch[subjectString]] {
    string formattedPhoneNumber =
        regexObj.Replace[subjectString, "[$1] $2-$3"];
} else {
    // Invalid phone number
}
0› là một lượng từ làm cho phần tử trước nó được lặp lại chính xác ba lần. Do đó, biểu thức chính quy ‹______91› tương đương với ‹
Regex regexObj =
    new Regex[@"^\[?[[0-9]{3}]\]?[-. ]?[[0-9]{3}][-. ]?[[0-9]{4}]$"];

if [regexObj.IsMatch[subjectString]] {
    string formattedPhoneNumber =
        regexObj.Replace[subjectString, "[$1] $2-$3"];
} else {
    // Invalid phone number
}
2›, nhưng ngắn hơn và hy vọng sẽ dễ đọc hơn. Dấu chấm hỏi [đã đề cập trước đó] là một bộ định lượng đặc biệt làm cho phần tử trước nó lặp lại 0 hoặc một lần. Nó cũng có thể được viết là ‹______93›. Bất kỳ bộ định lượng nào cho phép một thứ gì đó được lặp lại 0 lần một cách hiệu quả sẽ làm cho phần tử đó trở thành tùy chọn. Vì một dấu hỏi được sử dụng sau mỗi dấu phân cách, các chữ số của số điện thoại được phép chạy cùng nhau

Lưu ý rằng mặc dù công thức này tuyên bố xử lý các số điện thoại ở Bắc Mỹ, nhưng nó thực sự được thiết kế để hoạt động với các số Kế hoạch Đánh số Bắc Mỹ [NANP]. NANP là kế hoạch đánh số điện thoại cho các quốc gia có chung mã quốc gia “1”. Điều này bao gồm Hoa Kỳ và các vùng lãnh thổ của nó, Canada, Bermuda và 16 quốc gia Caribe. Nó không bao gồm Mexico và các quốc gia Trung Mỹ

Loại bỏ số điện thoại không hợp lệ

Cho đến nay, biểu thức chính quy khớp với bất kỳ số có 10 chữ số nào. Nếu bạn muốn giới hạn kết quả khớp với các số điện thoại hợp lệ theo Kế hoạch đánh số Bắc Mỹ, đây là các quy tắc cơ bản

  • Mã vùng bắt đầu bằng một số từ 2–9, tiếp theo là 0–8 và sau đó là bất kỳ chữ số thứ ba nào

  • Nhóm ba chữ số thứ hai, được gọi là văn phòng trung tâm hoặc mã trao đổi, bắt đầu bằng một số từ 2–9, theo sau là hai chữ số bất kỳ

  • Bốn chữ số cuối cùng, được gọi là mã trạm, không có hạn chế

Các quy tắc này có thể dễ dàng được thực hiện với một vài lớp ký tự

[$1]●$2-$3
0Tùy chọn Regex. Không có hương vị Regex. . NET, Java, JavaScript, PCRE, Perl, Python, Ruby

Ngoài các quy tắc cơ bản vừa được liệt kê, còn có nhiều số điện thoại dành riêng, chưa được chỉ định và bị hạn chế. Trừ khi bạn có những nhu cầu rất cụ thể yêu cầu bạn lọc ra càng nhiều số điện thoại càng tốt, đừng quá cố gắng loại bỏ những số không sử dụng. Các mã vùng mới phù hợp với các quy tắc được liệt kê trước đó được cung cấp thường xuyên và ngay cả khi một số điện thoại hợp lệ, điều đó không nhất thiết có nghĩa là nó đã được cấp hoặc đang được sử dụng

Tìm số điện thoại trong tài liệu

Hai thay đổi đơn giản cho phép biểu thức chính quy trước khớp với số điện thoại trong văn bản dài hơn

[$1]●$2-$3
1Tùy chọn Regex. Không có hương vị Regex. . NET, Java, JavaScript, PCRE, Perl, Python, Ruby

Ở đây, các xác nhận ‹

[$1]●$2-$3
6› và ‹
[$1]●$2-$3
7› ràng buộc biểu thức chính quy với phần đầu và phần cuối của văn bản đã bị xóa. Ở vị trí của chúng, mã thông báo ranh giới từ [‹______96›] đã được thêm vào để đảm bảo rằng văn bản phù hợp sẽ tự đứng vững và không phải là một phần của một số hoặc từ dài hơn

Tương tự như ‹

[$1]●$2-$3
6› và ‹
[$1]●$2-$3
7›, ‹
Regex regexObj =
    new Regex[@"^\[?[[0-9]{3}]\]?[-. ]?[[0-9]{3}][-. ]?[[0-9]{4}]$"];

if [regexObj.IsMatch[subjectString]] {
    string formattedPhoneNumber =
        regexObj.Replace[subjectString, "[$1] $2-$3"];
} else {
    // Invalid phone number
}
6› là một khẳng định phù hợp với một vị trí hơn là bất kỳ văn bản thực tế nào. Cụ thể, ‹
Regex regexObj =
    new Regex[@"^\[?[[0-9]{3}]\]?[-. ]?[[0-9]{3}][-. ]?[[0-9]{4}]$"];

if [regexObj.IsMatch[subjectString]] {
    string formattedPhoneNumber =
        regexObj.Replace[subjectString, "[$1] $2-$3"];
} else {
    // Invalid phone number
}
6› khớp với vị trí giữa một ký tự từ và một ký tự không phải từ hoặc phần đầu hoặc phần cuối của văn bản. Các chữ cái, số và dấu gạch dưới đều được coi là ký tự từ [xem Công thức 2. 6]

Lưu ý rằng mã thông báo ranh giới từ đầu tiên xuất hiện sau dấu ngoặc đơn mở, tùy chọn. Điều này rất quan trọng vì không có ranh giới từ nào được khớp giữa hai ký tự không phải từ, chẳng hạn như dấu ngoặc đơn mở và ký tự khoảng trắng trước đó. Ranh giới từ đầu tiên chỉ có liên quan khi khớp một số không có dấu ngoặc đơn, vì ranh giới từ luôn khớp giữa dấu ngoặc đơn mở và chữ số đầu tiên của số điện thoại

Bạn có thể cho phép một tùy chọn, đứng đầu số "1" cho mã quốc gia [bao gồm khu vực Kế hoạch đánh số Bắc Mỹ] thông qua phần bổ sung được hiển thị trong biểu thức chính quy sau

[$1]●$2-$3
9Tùy chọn Regex. Không có hương vị Regex. . NET, Java, JavaScript, PCRE, Perl, Python, Ruby

Ngoài các định dạng số điện thoại được hiển thị trước đó, biểu thức chính quy này cũng sẽ khớp với các chuỗi như

[$1]●$2-$3
01 và
[$1]●$2-$3
02. Nó sử dụng một nhóm không bắt giữ, được viết là ‹________ 103›. Khi một dấu chấm hỏi theo sau dấu ngoặc đơn bên trái không thoát như thế này, nó không phải là một bộ định lượng mà thay vào đó giúp xác định loại nhóm. Các nhóm thu thập tiêu chuẩn yêu cầu công cụ biểu thức chính quy theo dõi các tham chiếu ngược, do đó, việc sử dụng các nhóm không thu thập sẽ hiệu quả hơn bất cứ khi nào văn bản khớp với một nhóm không cần phải tham chiếu sau này. Một lý do khác để sử dụng nhóm không bắt giữ ở đây là để cho phép bạn tiếp tục sử dụng chuỗi thay thế giống như trong các ví dụ trước. Nếu chúng tôi đã thêm một nhóm chụp, chúng tôi sẽ phải thay đổi
[$1]●$2-$3
04 thành
[$1]●$2-$3
05 [và cứ thế] trong văn bản thay thế được hiển thị trước đó trong công thức này

Phần bổ sung đầy đủ cho phiên bản regex này là ‹

[$1]●$2-$3
06›. Số "1" trong mẫu này được đặt trước dấu cộng tùy chọn và theo sau tùy chọn là một trong ba dấu phân cách [dấu gạch nối, dấu chấm hoặc dấu cách]. Toàn bộ nhóm không chụp được thêm vào cũng là tùy chọn, nhưng vì "1" là bắt buộc trong nhóm nên dấu cộng trước và dấu phân cách không được phép nếu không có "1" đứng đầu

Cho phép số điện thoại có bảy chữ số

Để cho phép so khớp các số điện thoại bỏ qua mã vùng địa phương, hãy đặt nhóm chữ số đầu tiên cùng với dấu ngoặc đơn xung quanh và dấu phân cách theo sau trong một nhóm tùy chọn, không bắt giữ

[$1]●$2-$3
6Tùy chọn Regex. Không có hương vị Regex. . NET, Java, JavaScript, PCRE, Perl, Python, Ruby

Vì mã vùng không còn được yêu cầu như một phần của kết quả trùng khớp, nên chỉ cần thay thế bất kỳ kết quả trùng khớp nào bằng «________ 107» có thể không dẫn đến kết quả như ________ 108, với một bộ dấu ngoặc đơn trống. Để giải quyết vấn đề này, hãy thêm mã bên ngoài biểu thức chính quy để kiểm tra xem nhóm 1 có khớp với bất kỳ văn bản nào hay không và điều chỉnh văn bản thay thế cho phù hợp

Công thức 4. 3 cho biết cách xác thực số điện thoại quốc tế

Kế hoạch đánh số Bắc Mỹ [NANP] là kế hoạch đánh số điện thoại cho Hoa Kỳ và các vùng lãnh thổ của nó, Canada, Bermuda và 16 quốc gia Caribe. Thông tin thêm có sẵn tại http. //www. nanpa. com

Chủ Đề