2008-10-22 29 views
10

Tôi cần một biểu cũng được thử nghiệm thường xuyên (.net phong cách ưa thích), hoặc một số bit đơn giản khác của mã mà sẽ phân tích một số điện thoại USA/CA thành bộ phận cấu thành, vì vậy:Parse Số điện thoại thành bộ phận cấu thành

  • 1-303-555-1234x122
  • (303) 555-1234-122
  • 1 (303) 555 -1234-122

vv ...

tất cả các phân tích thành:

  • areacode: 303
  • giá: 555
  • Suffix: 1234
  • Extension: 122

Trả lời

2

Đây là một trong tôi sử dụng:

^(?:(?:[\+]?(?<CountryCode>[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?<AreaCode>[\d]{3})[\-/)]?(?:[ ]+)?)?(?<Number>[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?<Ext>[\d]{1,5}))?$ 

Tôi nhận được nó từ RegexLib Tôi tin.

+3

Điều đó thật khủng khiếp. Đôi mắt của toi đang chảy máu. –

+0

@Paul thử đọc nó được định dạng như thế này http://pastebin.com/n9eQjRst –

+0

javascript không có nhóm được đặt tên và nó không nắm bắt được phần mở rộng cho đến khi tôi đặt một? sau khoảng {6,}. Vết thương với: '/^(?:(?:[\+]?(\d{1,3}(?:\s+|[\-\.])))?[\(]?(\d {3}) [\ - \ /)]? (?: \ S +)?)? ([A-zA-Z2-9] [a-zA-Z0-9 \ - \.] {6,}?) (?: (?: \ s + | [xX] | (?: [Ee] xt [\.]?)) {1,2} (\ d {1,5}))? $/' –

1

Bỏ qua mọi thứ không phải là chữ số đầu tiên. Sau đó, tất cả các ví dụ của bạn giảm tới:

/^1?(\d{3})(\d{3})(\d{4})(\d*)$/

Để hỗ trợ tất cả các mã quốc gia là phức tạp hơn một chút, nhưng những nguyên tắc chung cũng áp dụng.

+1

tại sao điều này lại bị giảm? –

1

regex này hoạt động chính xác như bạn muốn với các ví dụ của bạn:

Regex regexObj = new Regex(@"\(?(?<AreaCode>[0-9]{3})\)?[-. ]?(?<Exchange>[0-9]{3})[-. ]*?(?<Suffix>[0-9]{4})[-. x]?(?<Extension>[0-9]{3})"); 
Match matchResult = regexObj.Match("1 (303) 555 -1234-122"); 

// Now you have the results in groups 
matchResult.Groups["AreaCode"]; 
matchResult.Groups["Exchange"]; 
matchResult.Groups["Suffix"]; 
matchResult.Groups["Extension"]; 
+0

Thêm +1 vào xem xét 'mới Regex (@ "1? \ (? (? [0-9] {3}) \)? [-.]? (? [0-9] {3}) [ -.] *? (? [0-9] {4}) [-. X]? (? [0-9] {3}) ");' ví dụ '+ 13035551234122' – Jaider

19

Không ai trong số các câu trả lời đưa ra để đủ mạnh mẽ cho tôi, vì vậy tôi tiếp tục tìm kiếm điều gì đó tốt hơn và tôi đã tìm thấy điều gì đó tốt hơn:

Google's library for dealing with phone numbers

Tôi hy vọng nó cũng hữu ích cho bạn.

+0

+1 cho tài nguyên tốt, -0.1 cho không .NET (chỉ là sở thích) Đáng buồn là chúng tôi đang làm toán số nguyên và nó bị cắt bớt thành 0. – Mir

+2

Bạn có thể cho biết thư viện này có thể phân tích cú pháp không một số điện thoại vào các bộ phận cấu thành của nó? Như OP đã đề cập, vào mã vùng, trao đổi và hậu tố? – TSmith

0

đây là một phương pháp dễ dàng hơn trên mắt được cung cấp bởi Directory Z (vettrasoft.com), hướng tới số điện thoại Mỹ:

string_o s2, s1 = "888/872.7676"; 
z_fix_phone_number (s1, s2); 
cout << s2.print();  // prints "+1 (888) 872-7676" 
phone_number_o pho = s2; 
pho.store_save(); 

dòng cuối cùng lưu trữ các số cơ sở dữ liệu bảng "PHONE_NUMBER". giá trị cột: country_code = "1", area_code = "888", exchange = "872", v.v.

Các vấn đề liên quan