Dùng VBScript.RegExp đão chuỗi ký tự.

Liên hệ QC

giaiphap

==(^o^)==
Tham gia
12/3/07
Bài viết
5,778
Được thích
6,274
Donate (Momo)
Donate
Giới tính
Nam
Các bác cho em hỏi về đão chuỗi bằng VBScript.RegExp. Em có chuỗi họ và tên như sau: Trần Thị Thanh Nhanh, em dùng code sau để đão chuỗi thành Nhanh Trần Thị Thanh (Tên --> Họ --> Chữ lót).
Mã:
Function Dao_Ten(ByVal hoten As String) As String
On Error Resume Next
    Dim objRe As Object
    Set objRe = CreateObject("VBScript.RegExp")
    objRe.Pattern = "(.+\s)(\S+)"
    Dao_Ten = WorksheetFunction.Trim(objRe.Replace(hoten, "$2 $1"))
End Function
Bây giờ nhu cầu của em là đão chuỗi lại thành Nhanh Thị Thanh Trần (Tên --> Chữ lót --> Họ), vậy mình sửa code chổ objRe.Pattern = "(.+\s)(\S+)" như thế nào mới hợp lý ạ?
 
Từ đầu câu là bắt đầu từ ký hiệu đầu câu cho tới một ký tự không phải thuộc từ (dấu cách, phẩy, chấm,...)
Từ cuối câu là bắt đầu từ một ký tự không phải thuộc từ cho đến ký hiệu cuối câu
Ký hiệu đầu câu à dấu mũ ^
Ký hiệu cuối câu là dấu đồng $
Ký tự thuộc từ là \w
Ký tự không thuộc từ là \W
 
Từ đầu câu là bắt đầu từ ký hiệu đầu câu cho tới một ký tự không phải thuộc từ (dấu cách, phẩy, chấm,...)
Từ cuối câu là bắt đầu từ một ký tự không phải thuộc từ cho đến ký hiệu cuối câu
Ký hiệu đầu câu à dấu mũ ^
Ký hiệu cuối câu là dấu đồng $
Ký tự thuộc từ là \w
Ký tự không thuộc từ là \W
Cảm ơn bạn! Bạn gợi ý mình mò hoài cuối cùng cũng ra được kết quả nhưng biết chắc rằng sẽ không giống như gợi ý của bạn, công nhận cái điều kiện Pattern nhức đầu thật, đọc tới lui hoài vẫn không hiểu. sẳn em đưa cái code đó lên đây bạn xem và góp ý, hoặc đặt lại Pattern cho nó đẹp hơn hay không.
Mã:
Function Dao_Ten(ByVal hoten As String) As String
On Error Resume Next
    Dim objRe As Object
    Set objRe = CreateObject("VBScript.RegExp")
    objRe.Pattern = "(.\S+)(.+\s)(\S+)"
    Dao_Ten = WorksheetFunction.Trim(objRe.Replace(hoten, "$3 $2 $1"))
End Function
 
Cảm ơn bạn! Bạn gợi ý mình mò hoài cuối cùng cũng ra được kết quả nhưng biết chắc rằng sẽ không giống như gợi ý của bạn, công nhận cái điều kiện Pattern nhức đầu thật, đọc tới lui hoài vẫn không hiểu. sẳn em đưa cái code đó lên đây bạn xem và góp ý, hoặc đặt lại Pattern cho nó đẹp hơn hay không.
Mã:
Function Dao_Ten(ByVal hoten As String) As String
On Error Resume Next
    Dim objRe As Object
    Set objRe = CreateObject("VBScript.RegExp")
    objRe.Pattern = "(.\S+)(.+\s)(\S+)"
    Dao_Ten = WorksheetFunction.Trim(objRe.Replace(hoten, "$3 $2 $1"))
End Function
Pattern của bạn bắt buộc phải có chữ lót, nếu chỉ có họ và tên sẽ bị sai, bạn sửa ".+" thành ".*" và nên thêm ^,$ để yêu cầu xét nguyên chuỗi!
objRe.Pattern ="^(\S+)(.*\s)(\S+)$"
 
Nhu cầu chỉ có vậy mà dùng RegExp thì phí quá.
 
Nhu cầu chỉ có vậy mà dùng RegExp thì phí quá.
Tôi chắc là bạn ấy chỉ muốn tập thử cho quen thôi.
Mấy cái mẫu Regex nó cũng như mấy bài toán đố, tập riết thì quen, chẳng có gì là nguy hiểm.
Tới mọt trình đọ nào đó mới cần phải để ý đến loại mẫu tham và loại mẫu thảo (loại mẫu tham nó ngốn tài nguyên máy dữ lắm)
 
Nhu cầu chỉ có vậy mà dùng RegExp thì phí quá.
Nhờ bạn tư vấn cho, thấy anh em trong diễn đàn cũng hay dùng cách này để tách chuỗi hoặc số nên thử áp dụng cho biết, còn việc phí hay không thì mình cũng chưa rõ.
Tôi chắc là bạn ấy chỉ muốn tập thử cho quen thôi.
Mấy cái mẫu Regex nó cũng như mấy bài toán đố, tập riết thì quen, chẳng có gì là nguy hiểm.
Tới mọt trình đọ nào đó mới cần phải để ý đến loại mẫu tham và loại mẫu thảo (loại mẫu tham nó ngốn tài nguyên máy dữ lắm)
Mới tìm hiểu thôi bác nên cũng rất gà vấn đề này.
 
Nhờ bạn tư vấn cho, thấy anh em trong diễn đàn cũng hay dùng cách này để tách chuỗi hoặc số nên thử áp dụng cho biết, còn việc phí hay không thì mình cũng chưa rõ.

Mới tìm hiểu thôi bác nên cũng rất gà vấn đề này.
Bạn có thể dùng hàm Instr và InstrRev để xác định vị trí khoảng trắng đầu tiên và cuối cùng sau đó dùng các hàm cắt chuỗi để cắt và sắp xếp lại.
 
Bạn có thể dùng hàm Instr và InstrRev để xác định vị trí khoảng trắng đầu tiên và cuối cùng sau đó dùng các hàm cắt chuỗi để cắt và sắp xếp lại.
Cảm ơn bạn, 2 hàm này thì mình biết sử dụng rồi. Cái mình muốn tìm hiểu là giữa cái dùng hàm Instr và InstrRev để đão chuỗi và cách sử dụng VBScript.RegExp để đão chuỗi thì cách nào chạy nhanh hơn? cách nào tốn bộ nhớ nhiều hơn?...
 
Regex là một cỗ máy nặng. Bạn có thể tưởng tượng như một cái xe tải kéo công ten nơ.
Nhưng hàm khác của VBA cũng như xe du lịch Toyota, trừ một vài thứ có thể kể là Landcruiser.
Việc "chạy nhanh" và "tốn bộ nhớ" rất chủ quan và tương đối.
Tôi chỉ có thể nói rằng: nếu bạn phải hỏi câu này thì hiện tại xe tải công ten nơ đương nhiên chạy chậm hơn, tốn dầu hơn và choáng đường hơn. (*)

(*) gợi ý: ở bài #2, thay vì nói về mẫu tự và dấu cách, tôi lại nói về ký tự thuộc từ và không thuộc từ. Tức là tôi đang nghĩ đến bãi cảng tàu chứ không phải bến taxi.
 
Web KT
Back
Top Bottom