Tách số điện thoại (1 người xem)

Người dùng đang xem chủ đề này

toan.vcom

Thành viên mới
Tham gia
16/10/12
Bài viết
6
Được thích
0
Mình đang có một vấn đề khá khó là muốn tách số di động ra khỏi một cụm gồm cả số may bàn nhưng trong ô đó có cả ký tự vi dụ như: [TABLE="width: 230"]
[TR]
[TD="class: xl66, width: 230, align: left"]nr:7565553 - dđ: 0913302133 - cq:
Mong các anh và mọi ngưòi trợ gúp . Xin cảm ơn[/TD]
[/TR]
[/TABLE]
 

File đính kèm

Công thức cho ô C2 :

PHP:
=LEFT(TRIM(MID(SUBSTITUTE(B2,":",REPT(" ",255)),255*2,255)),11)
 
Thanks! bạn cho mình hỏi thêm 1 chút là nếu có người nhập nhầm số đt di động vào ô điện thoại nhà riêng. mình cũng muốn lấy số đó ra có được không ban.

Bạn để ý chỗ mình ghi 255*2 --> nếu muốn lấy số nhà riêng thì sửa : 255*1 , còn số 11 ở cuối hàm Left() là số mình tự điền vào, --> bạn ngâm cứu sao cho tối ưu nhất nhé !
 
Lần chỉnh sửa cuối:
Thanks! bạn cho mình hỏi thêm 1 chút là nếu có người nhập nhầm số đt di động vào ô điện thoại nhà riêng. mình cũng muốn lấy số đó ra có được không ban.

Nếu bạn xét cả trường hợp nhầm thì không thể lấy theo vị trí được. Mà cũng có thể nhầm kiểu khác: chỗ dđ là số ở nhà, chỗ số nhà thì lại là dđ?
Nếu đã xét nhầm thì không thể xét theo vị trí mà phải xét theo "số điện thoại". Xét xem số thứ 1 hay thứ 2 có phải là số dđ hay không.
 
Nếu bạn xét cả trường hợp nhầm thì không thể lấy theo vị trí được. Mà cũng có thể nhầm kiểu khác: chỗ dđ là số ở nhà, chỗ số nhà thì lại là dđ?
Nếu đã xét nhầm thì không thể xét theo vị trí mà phải xét theo "số điện thoại". Xét xem số thứ 1 hay thứ 2 có phải là số dđ hay không.
Anh ơi nếu bài này mà dùng RegEXp thì chuỗi Pattern được viết như thế nào ạ ? ---> em mới đang tìm hiểu về Reg nên nghĩ mãi mà không ra :

Em có đọc 1 bài anh viết như vầy :
Khoảng thời gian đó tôi có viết một bài nói đầy đủ về Backreferences và mấy kiểu pattern nhưng để một thời gian thấy chả ai đọc chả ai có ý kiến nên tôi xóa đi.
Chả ai nhờ, chả ai yêu cầu mà tự dưng viết rồi chả ai đọc tôi thấy mình vô duyên quá.
Trước khi xóa tôi có lưu lại ở dạng HTML. Nếu bạn cần thì tôi có thể gửi vào tin nhắn cho bạn.

^^ anh có thể gửi 1 ít tài liệu vào mail : Manh.Hung.DHXD@gmail.com , cho em học tập được không ?
Cảm ơn anh trước nhé --=0
 
Lần chỉnh sửa cuối:
Anh ơi nếu bài này mà dùng RegEXp thì chuỗi Pattern được viết như thế nào ạ ? ---> em mới đang tìm hiểu về Reg nên nghĩ mãi mà không ra :

Em có đọc 1 bài anh viết như vầy :


^^ anh có thể gửi 1 ít tài liệu vào mail : Manh.Hung.DHXD@gmail.com , cho em học tập được không ?
Cảm ơn anh trước nhé --=0

Tôi đã gửi. Nếu bạn nhận được thì thông báo ở đây để tôi biết.

Tôi gửi từ hộp tin dự bị do tôi không cho ai địa chỉ chính cả. Hộp thư dự bị tôi chỉ dùng trong những trường hợp phải trả lời như thế này nhưng tôi không bao giờ kiểm tra hộp thư này vì mọi thư mong đợi thì tôi kiểm tra trong hộp thư chính. Hoặc chỉ kiểm tra khi hẹn nhận trả lời của ai đó.
 
Tôi đã gửi. Nếu bạn nhận được thì thông báo ở đây để tôi biết.

Tôi gửi từ hộp tin dự bị do tôi không cho ai địa chỉ chính cả. Hộp thư dự bị tôi chỉ dùng trong những trường hợp phải trả lời như thế này nhưng tôi không bao giờ kiểm tra hộp thư này vì mọi thư mong đợi thì tôi kiểm tra trong hộp thư chính. Hoặc chỉ kiểm tra khi hẹn nhận trả lời của ai đó.

Em nhận được tài liệu của anh rồi , em cảm ơn anh rất nhiều!
*/Từ ngày vào diễn đàn GPE em theo dõi bài viết của anh rất nhiều . em thấy :
- Thật là thiệt thòi cho những thành viên nào yêu thích món "tư duy giải thuật lập trình " mà không được anh nhận xét ,phân tích, góp ý cho những bài viết ,đề tài của thành viên đó!
--->^^vừa học vừa thực hành , em viết đoạn code sau :
[GPECODE=vb]
Sub Regx()
Dim str As String, oMatch As Object
str = "nr:7565553 - dð: 0913302133 - cq: "
With CreateObject("VBscript.Regexp")
.Global = True
.Pattern = "dð\s*:\s+\d{10,11}"
'If .test(str) Then
Set oMatch = .Execute(str)
MsgBox oMatch(0)
'End If
End With
End Sub
[/GPECODE]
* Một lần nữa , chân thành cảm ơn anh nhiều
 
Em nhận được tài liệu của anh rồi , em cảm ơn anh rất nhiều!
*/Từ ngày vào diễn đàn GPE em theo dõi bài viết của anh rất nhiều . em thấy :
- Thật là thiệt thòi cho những thành viên nào yêu thích món "tư duy giải thuật lập trình " mà không được anh nhận xét ,phân tích, góp ý cho những bài viết ,đề tài của thành viên đó!
--->^^vừa học vừa thực hành , em viết đoạn code sau :
[GPECODE=vb]
Sub Regx()
Dim str As String, oMatch As Object
str = "nr:7565553 - dð: 0913302133 - cq: "
With CreateObject("VBscript.Regexp")
.Global = True
.Pattern = "dð\s*:\s+\d{10,11}"
'If .test(str) Then
Set oMatch = .Execute(str)
MsgBox oMatch(0)
'End If
End With
End Sub
[/GPECODE]
* Một lần nữa , chân thành cảm ơn anh nhiều

1. Kết quả hiện nay có cả các ký tự ": "
2. Nếu dđ cũng là nhập nhầm ở nr và cũng phải lấy thì vd.
Mã:
Sub Regx()
    Dim str As String, oMatch As Object, k As Long
    On Error Resume Next
        str = "nr:7565553 - d?: 0913302133 - cq: "
        With CreateObject("VBscript.Regexp")
            .Global = True
            .pattern = "\d+"
            Set oMatch = .Execute(str)
            
            For k = 0 To 1  ' to 2 neu kiem tra ca so co quan
                ' kiem tra xem co la so di dong khong thi lay
                ' MsgBox oMatch(k)
            Next k
        End With
End Sub

Việc viết code như thế nào phụ thuộc vào dữ liệu và yêu cầu.
1. Nếu ta chỉ lấy số sau "dđ: " và dữ liệu có thể là "nr ... dđ ... cq" lúc thì "dđ ... cq" thì bắt buộc ta phải xét pattern có chứa "dđ" kiểu gần như bạn làm.
2. Nếu cứ số dđ thì lấy - kể cả sau nr: vì có thể viết nhầm. Nếu thế thì đằng nào cũng phải tìm hết các số rồi kiểm tra xem có đúng số dđ không. Lúc đó thì pattern như tôi dùng ở trên
 
1. Kết quả hiện nay có cả các ký tự ": "
2. Nếu dđ cũng là nhập nhầm ở nr và cũng phải lấy thì vd.

Việc viết code như thế nào phụ thuộc vào dữ liệu và yêu cầu.
1. Nếu ta chỉ lấy số sau "dđ: " và dữ liệu có thể là "nr ... dđ ... cq" lúc thì "dđ ... cq" thì bắt buộc ta phải xét pattern có chứa "dđ" kiểu gần như bạn làm.
2. Nếu cứ số dđ thì lấy - kể cả sau nr: vì có thể viết nhầm. Nếu thế thì đằng nào cũng phải tìm hết các số rồi kiểm tra xem có đúng số dđ không. Lúc đó thì pattern như tôi dùng ở trên

Bây giờ giả sử : số điện thoại di động là số có từ 10-11 chữ số ,
* với chuỗi : "nr:7565553 - dd: 0913302133 - cq: --> yêu cầu tách ra các số di động có dạng :0913.302.133
Em viết như vậy ( không biết đã tối ưu chưa ? ) , và có cách nào để gộp 2 pattern vào thành 1 pattern duy nhất không anh ?
[GPECODE=vb]
Sub Regx()
Dim str As String, omatch As Object
str = "nr:7565553 - dd: 0913302133 - cq: "
With New RegExp
.Global = True
.Pattern = "\d{10,11}"
If .Test(str) Then
str = .Execute(str)(0)
.Pattern = "\B(?=\d{3}$)|\B(?=\d{6}$)"
str = .Replace(str, ".")
MsgBox str
End If
End With
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Bây giờ giả sử : số điện thoại di động là số có từ 10-11 chữ số ,
* với chuỗi : "nr:7565553 - dd: 0913302133 - cq: --> yêu cầu tách ra các số di động có dạng :0913.302.133
Em viết như vậy ( không biết đã tối ưu chưa ? ) , và có cách nào để gộp 2 pattern vào thành 1 pattern duy nhất không anh ?
[GPECODE=vb]
Sub Regx()
Dim str As String, omatch As Object
str = "nr:7565553 - dd: 0913302133 - cq: "
With New RegExp
.Global = True
.Pattern = "\d{10,11}"
If .Test(str) Then
str = .Execute(str)(0)
.Pattern = "\B(?=\d{3}$)|\B(?=\d{6}$)"
str = .Replace(str, ".")
MsgBox str
End If
End With
End Sub
[/GPECODE]

Trước tiên phải "vọc" nhiều cho biết sau mới tính tới tối ưu. Vì làm sao có thể nghĩ tới tối ưu khi mà ta còn biết rất ít các cấu trúc, dạng pattern, phương pháp?

vd. - tôi cho là thế thôi chứ chưa nghĩ sâu:

Mã:
Sub Regx()
    Dim str As String
        str = "nr:7565553 - dd: 0913302133 - cq: "
    With CreateObject("VBScript.RegExp")
        .pattern = ".+\D(\d{3,4})(\d{3})(\d{3})\D.+"
        If .test(str) Then
            str = .replace(str, "$1.$2.$3")
            MsgBox str
        End If
    End With
End Sub
 

Bài viết mới nhất

Back
Top Bottom