Thử nghiệm VBScript RegExp

Liên hệ QC

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,043
Được thích
7,936
Nghề nghiệp
Làm đủ thứ
Chúng ta cùng khảo sát những ứng dụng cơ bản của VBScript RegExp
Thông thường khi muốn tách số ra khỏi 1 chuỗi lẫn lộn vừa số vừa chữ thì chúng ta hay dùng vòng lặp để xử lý, nhưng với VBR thì công việc này khá đơn giản với dạng code thế này

Ví dụ này ta chỉ chú ý đến .Pattern="\D"
Phương thức này sẽ tìm tất cả các ký tự không phải là số

Tiếp theo ta dùng phương thức .Replace để thay các ký tự được tìm thấy bằng chuỗi rỗng (xoá các ký tự đó) để còn lại kết quả là những con số

PHP:
Sub RegExp1()
Dim VBR As Object, kq
Set VBR = CreateObject("VBScript.RegExp")
With VBR
   For i = 1 To 5
      .Global = True
      .Pattern = "\D"
      Cells(i, 2) = .Replace(Cells(i, 1), "")
   Next
End With
End Sub

Cũng với code tương tự chúng ta có thể cộng các con số đựơc tìm thấy lại với nhau
Ở đây ta để ý đến phần .Pattern="\B"
Nếu chúng ta sử dụng .Pattern="" thì có nghĩa ta đang nói đến bắt đầu và kết thúc của 1 ký tự, khi ta muốn thêm dấu + giữa các con số tìm được thì ta có kết quả thế này: +1+2+3+4+5+

Nhưng với .Pattern = "\B" thì sẽ loại được dấu cộng không mong muốn ở đầu và cuối của dãy số tìm được. Sau đó chúng ta dùng hàm Evaluate để biến chuỗi này thành bài toán cộng

PHP:
Sub RegExp2()
Dim VBR As Object, kq
Set VBR = CreateObject("VBScript.RegExp")
With VBR
   For i = 1 To 5
      .Global = True
      .Pattern = "\D"
      kq = .Replace(Cells(i, 1), "")
      .Pattern = "\B"
      Cells(i, 2) = Evaluate(.Replace(kq, "+"))
   Next
End With
End Sub

Để tách lấy các ký tự trong 1 chuỗi lẫn lộn số và chữ ta sử dụng .Pattern="\d"
"\d" sẽ tìm tất cả con số trong chuỗi để xử lý
PHP:
Sub RegExp3()
Dim VBR As Object, kq
Set VBR = CreateObject("VBScript.RegExp")
With VBR
   For i = 1 To 5
      .Global = True
      .Pattern = "\d"
      Cells(i, 2) = .Replace(Cells(i, 1), "")
   Next
End With
End Sub
Nhưng không may trong chuỗi ký tự có những ký tự không phải là những mẫu tự, ta có thể dùng thế này "\W" kết hợp với "\d" để khử hết các ký tự đó. Nhưng không hiểu sao ký tự _ vẫn không được xử lý triệt để nên tôi phải kết hợp thêm dấu _ trong Pattern
Lưu ý là chúng ta không bàn đến tiếng việt có dấu nha

PHP:
Sub RegExp4()
Dim VBR As Object, kq
Set VBR = CreateObject("VBScript.RegExp")
With VBR
   For i = 1 To 5
      .Global = True
      .Pattern = "[\W\d,_]"
      Cells(i, 2) = .Replace(Cells(i, 1), "")
   Next
End With
End Sub
 
Lần chỉnh sửa cuối:
Vậy thì anh biểu diễn luôn đi. Nói thiệt là anh em đang quá trình nghiên cứu chứ không hiểu sâu đâu!

Tuấn nói có vẻ dễ nhỉ. Nhiều khi thuộc lòng một vai mà vẫn có thể có lần sẩy ra sự cố để rồi cà chua thối trứng thối biết bay đi đâu.
Vẫn biết phải có đinh và búa, và phải gõ vào cái đầu "tòe tòe" này thế mà không ít lần vẫn chọt vào ngón tay.
Mỗi ký tự trong cụm là chữ cái, chữ số hoặc "_" vậy paterrn cho cum1 = (cụm abc...xyz) có lẽ là "\b\w+\b". Pattern cho cum2 = (cụm abc...xyz) cũng là "\b\w+\b". Vấn đề còn lại chỉ là trong kết quả trả về thì cum1 và cum2 là y như nhau. Và phải tìm tất cả các "cặp" từ lặp như thế.
vd. chuỗi "ngay mai mai ta di ca ca phe nhe em em nhe" (em nó nói lắp, thông cảm nhé) thì kết quả là "ngay mai ta di ca phe nhe em nhe"
 
Upvote 0
Tuấn nói có vẻ dễ nhỉ. Nhiều khi thuộc lòng một vai mà vẫn có thể có lần sẩy ra sự cố để rồi cà chua thối trứng thối biết bay đi đâu.
Vẫn biết phải có đinh và búa, và phải gõ vào cái đầu "tòe tòe" này thế mà không ít lần vẫn chọt vào ngón tay.
Mỗi ký tự trong cụm là chữ cái, chữ số hoặc "_" vậy paterrn cho cum1 = (cụm abc...xyz) có lẽ là "\b\w+\b". Pattern cho cum2 = (cụm abc...xyz) cũng là "\b\w+\b". Vấn đề còn lại chỉ là trong kết quả trả về thì cum1 và cum2 là y như nhau. Và phải tìm tất cả các "cặp" từ lặp như thế.
vd. chuỗi "ngay mai mai ta di ca ca phe nhe em em nhe" (em nó nói lắp, thông cảm nhé) thì kết quả là "ngay mai ta di ca phe nhe em nhe"

Sao chả ai có ý kiến gì vậy? Ít ra nếu ai đó hỏi thêm chi tiết hay đề nghị pattern nào đó thì dù đúng dù sai cũng biết được có người theo dõi chủ đề. Còn không chả biết "khán giả" đang ngủ gật hết hay thậm chí chả có ai cả.
Nhưng thôi, tôi đề nghị một pattern. Tôi cũng "nhìn kỹ" RegExp thời gian gần đây thôi nên có thể hiểu không đúng. Trước đó tôi cũng có biết nhưng chỉ là: mặt mũi nó thế nào, nó dùng làm gì, thế thôi.
----------
Về câu hỏi thì ta dùng Backreferences thôi. Nói nôm na thì nếu có một đoạn trong pattern được đóng trong cặp ngoặc () thì nó được ghi nhớ (có ngoại lệ, không phải cứ đoạn nào nằm trong ngoặc là Backreferences) để:
1. Trong phần tiếp theo của pattern có thể truy cập ngược tới "chỗ" được ghi nhớ trước đó. Các cụm trong ngoặc được nhớ theo thứ tự và nếu muốn truy cập tới "cụm" n thì viết \n, với n = 1, 2, ...
Nên nhớ là viết \1 không phải với mục đích để gõ ít đi. \1 có nghĩa là tại "chỗ đó" phải có nội dung trong kết quả tìm được "y hệt" như đoạn trong ngoặc đầu tiên. Nếu đoạn trong ngoặc là cụ thể (pho) thì chả cần gõ \1 làm gì mà gõ luôn "pho" tại đó, và cũng chả cần cho "pho" đầu tiên vào ngoặc. Nhưng có những tình huống khi ta chỉ có trong ngoặc "dạng" thôi thì chỗ "kia" ta không biết gõ thế nào để nó "y hệt" như chỗ trong ngoặc. Lúc đó ta dùng \1.
vd. pattern "(...)abc(...)defgh\2xyz\1"
Thì nếu tìm thấy thì trong mỗi kết quả trả về tại chỗ mầu đỏ và chỗ \1 phải có 2 cụm từ "y hệt" nhau, tại chỗ mầu xanh và \2 phải có 2 cụm từ "y hệt" nhau.
2. Ở trên ta dùng \1, \2, ... để truy cập tới một đoạn trong pattern đã có trước đó và được ghi nhớ - do đặt trong ngoặc "()" - trong phần tiếp theo của pattern.
Nhưng ta cũng có thể dùng những đoạn ghi nhớ trong phương thức Replace, nhưng ghi là $1, $2, ...
Vd. với Pattern = "([a-z\s]+)abc([a-z\s]+)defgh\2xyz\1" và chuỗi:
s = "toi anabccomdefghcomxyztoi an hic hic anh ay nhauabcthit chodefghthit choxyzanh ay nhau ec ec"
Nếu ta có kq = .Replace(s, "$1 $2")
thì kq = "toi an com hic hic anh ay nhau thit cho ec ec"
Tại sao thế? Ta có 2 đoạn tìm thấy trong chuỗi s là:
1. "toi anabccomdefghcomxyztoi an" trong đó $1 = "toi an", $2 = "com"
Replace đổi đoạn này trong chuỗi s thành "$1 $2" = "toi an com"
2. "anh ay nhauabcthit chodefghthit choxyzanh ay nhau" trong đó $1 = "anh ay nhau", $2 = "thit cho"
Replace đổi đoạn này trong chuỗi s thành "$1 $2" = "anh ay nhau thit cho"
Kết quả: "toi anabccomdefghcomxyztoi an hic hic anh ay nhauabcthit chodefghthit choxyzanh ay nhau ec ec" bị đổi thành "toi an com hic hic anh ay nhau thit cho ec ec"
Mã:
Sub test()
Dim s As String, re As Object
    s = "toi anabccomdefghcomxyztoi an hic hic anh ay nhauabcthit chodefghthit choxyzanh ay nhau ec ec"
    
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.IgnoreCase = True
    re.pattern = "([a-z\s]+)abc([a-z\s]+)defgh\2xyz\1"
    If re.test(s) Then
        s = re.replace(s, "$1 $2")
    End If
    Debug.Print s
End Sub
-----------
Bây giờ thì dễ rồi

Mã:
Sub huhu()
Dim s As String, re As Object
    s = "ngay mai mai ta di ca ca phe nhe em em nhe"
    
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.IgnoreCase = True
    re.pattern = "(\b\w+\b)\s+\1"
    If re.test(s) Then
        s = re.replace(s, "$1")
    End If
    Debug.Print s
End Sub

----------------------
Nếu ta muốn xử lý tình huống "từ" được lặp lại liên tiếp 2 hoặc > 2 lần mà ta muốn viết 1 pattern thì
Mã:
Sub huhu()
Dim s As String, re As Object
    s = "ngay mai mai mai mai mai ta di ca ca ca ca phe nhe em em em em em em nhe"
    
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.IgnoreCase = True
    re.pattern = "(\b\w+\b)\s+(\1\s)*\1"
    If re.test(s) Then
        s = re.replace(s, "$1")
    End If
    Debug.Print s
End Sub

Kết quả s = "ngay mai ta di ca phe nhe em nhe"

Mọi người kiểm tra xem có lỗi không nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Sao chả ai có ý kiến gì vậy? Ít ra nếu ai đó hỏi thêm chi tiết hay đề nghị pattern nào đó thì dù đúng dù sai cũng biết được có người theo dõi chủ đề. Còn không chả biết "khán giả" đang ngủ gật hết hay thậm chí chả có ai cả.
Nhưng thôi, tôi đề nghị một pattern. Tôi cũng "nhìn kỹ" RegExp thời gian gần đây thôi nên có thể hiểu không đúng. Trước đó tôi cũng có biết nhưng chỉ là: mặt mũi nó thế nào, nó dùng làm gì, thế thôi.

Má ơi... nó lằng nhằng như.. mì tôm cua ấy ---> Anh bào ai mà có Ý KIẾN với Ý CÒ gì được đây?
Ẹc... Ec...
Chỉ chở để CHIÊM NGƯỞNG thôi anh à!
 
Upvote 0
RegExp - phần tiếp theo

Ta định nghĩa khái niệm cho bài tập:
Ta gọi các chuỗi gồm chữ cái, chữ số, "_" và dấu cách mà ký tự đầu và cuối thuộc \w (chữ cái, chữ số, "_"), và phần đầu và phần cuối y hệt nhau là các chuỗi dạng A.

vd. "11", "1234512", "abc23dea", "anh oi la anh" là các chuỗi dạng A.
--------------------
Cho một chuỗi str, trong bài tập này ta chỉ xét các đoạn dạng A mà hoặc ký tự đầu (ký tự cuối) của nó cũng là ký tự đầu (ký tự cuối) của str hoặc trước ký tự đầu (sau ký tự cuối) của nó là dấu cách (xét trong chuỗi str).

vd. str = "1234512" thì ta chỉ xét 1 đoạn duy nhất là chính str. Đoạn "123451" ta không xét vì sau ký tự cuối (ký tự 1) của đoạn này thì trong str có ký tự 2 (<> dấu cách). Tương tự ta không xét đoạn "234512" mặc dù có dạng A.

Hãy viết pattern tìm ra các chuỗi có dạng đang xét ngắn nhất có thể.
---------
Thôi, cho chuỗi cụ thể:
s = "11 1234512 abc23dea anh oi la anh 11
Kết quả là:
11, 1234512, abc23dea, anh oi la
 
Lần chỉnh sửa cuối:
Upvote 0
- Thưa bác siwtom vấn đề RegExp quả là khó thật đấy, nhưng chắc chắn sẽ rất hữu ích (mặc dù còn phải tìm hiểu dài dài). Vậy bác có thể giải đáp câu đố trong bài #44 được không ạ và nếu bác có "bài giảng" như trên thì hay quá.(2 tháng rồi chưa có ai giải cả)
- Bác cho dhn46 hỏi: với bài #42, #44 sau khi đánh dấu được các chuỗi $1, $2... thì có cách nào để trích xuất $1$2 không ạ. Ví dụ với bài toán yêu cầu lọc ký tự trùng trong 1 dãy số nếu ứng dụng được cái này thì không cần Dic, không cần vòng lặp
Tks GPE!
 
Upvote 0
- Thưa bác siwtom vấn đề RegExp quả là khó thật đấy, nhưng chắc chắn sẽ rất hữu ích (mặc dù còn phải tìm hiểu dài dài). Vậy bác có thể giải đáp câu đố trong bài #44 được không ạ và nếu bác có "bài giảng" như trên thì hay quá.(2 tháng rồi chưa có ai giải cả)
- Bác cho dhn46 hỏi: với bài #42, #44 sau khi đánh dấu được các chuỗi $1, $2... thì có cách nào để trích xuất $1$2 không ạ. Ví dụ với bài toán yêu cầu lọc ký tự trùng trong 1 dãy số nếu ứng dụng được cái này thì không cần Dic, không cần vòng lặp
Tks GPE!

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.
 
Upvote 0
Vâng thế thì hay quá, dạ cảm ơn bác nhiều. Dhn46 ngồi voọc mấy cái này mà không có đáp án. Cảm ơn bác ạ!
 
Upvote 0
Anh chàng khởi nghiệp (anh QuangHaixxxx) giám đốc đi đâu mất, tại sao tất cả sự nghiệp công việc điều bỏ ngõ hết, 1 mình cố vấn switom lo hết làm sao được, trở lại lo tiếp công việc mình đi chứ:google_lt:
máy bài đầu xem thì mely qua càng về sau đầu tóc dựng cả lên !~` :evil2: <đúng là bãi rốt mênh mong học mãi mà vẫn chưa hết+-+-+-+>
 
Upvote 0
Để tách tên mình dùng Pattern này
PHP:
Function ten(cell As Range)
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = ".*\s"
      ten = .Replace(Trim(cell), "")
   End With
End Function
Để tách lấy họ mình dùng Pattern này
PHP:
Function ho(cell As Range)
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = "\s.*"
      ho = .Replace(Trim(cell), "")
   End With
End Function
Xin hỏi các anh chị ngoài cách dưới đây có cách nào dùng 1 Pattern để lấy được các ký tự bên trong của dấu cách đầu và dấu cách cuối để tách phần tên lót ra hay không?
PHP:
Function tenlot(cell As Range)
Dim ho As String, ten As String
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = ".*\s"
      ten = .Replace(Trim(cell), "")
      .Pattern = "\s.*"
      ho = .Replace(Trim(cell), "")
      tenlot = Application.Trim(Replace(Replace(cell, ho, ""), ten, ""))
   End With
End Function
 
Upvote 0
Để tách tên mình dùng Pattern này
PHP:
Function ten(cell As Range)
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = ".*\s"
      ten = .Replace(Trim(cell), "")
   End With
End Function
Để tách lấy họ mình dùng Pattern này
PHP:
Function ho(cell As Range)
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = "\s.*"
      ho = .Replace(Trim(cell), "")
   End With
End Function
Xin hỏi các anh chị ngoài cách dưới đây có cách nào dùng 1 Pattern để lấy được các ký tự bên trong của dấu cách đầu và dấu cách cuối để tách phần tên lót ra hay không?
PHP:
Function tenlot(cell As Range)
Dim ho As String, ten As String
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = ".*\s"
      ten = .Replace(Trim(cell), "")
      .Pattern = "\s.*"
      ho = .Replace(Trim(cell), "")
      tenlot = Application.Trim(Replace(Replace(cell, ho, ""), ten, ""))
   End With
End Function

Chưa cần suy nghĩ kỹ đã có 1 ví dụ
[GPECODE=vb]
Function tenlot(cell As Range)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "^[^\s]+|[^\s]+$"
tenlot = Trim(.Replace(Trim(cell), ""))
End With
End Function
[/GPECODE]

hoặc

[GPECODE=vb]
Function tenlot1(cell As Range) As String
On Error Resume Next
With CreateObject("vbscript.regexp")
.Pattern = "\s.+\s"
tenlot1 = Trim(.Execute(Trim(cell)).Item(0).Value)
End With
End Function
[/GPECODE]

------------------
Ái chà.
Dạng 2 viết xong gửi lên mới thấy là giống cách của dhn46.
Coi như không tính cách 2.
 
Lần chỉnh sửa cuối:
Upvote 0
Voọc chút tài liệu quý của bác Siwtom dhn46 cũng tham gia 1 chút
Mã:
Function tenlot(cell As Range)
   With CreateObject("vbscript.regexp")
      .Pattern = "\s\D+\s"
       Set matches = .Execute(cell)
       tenlot = Trim(matches.Item(0))
    End With
End Function
 
Upvote 0
Voọc chút tài liệu quý của bác Siwtom dhn46 cũng tham gia 1 chút
Mã:
Function tenlot(cell As Range)
   With CreateObject("vbscript.regexp")
      .Pattern = "\s\D+\s"
       Set matches = .Execute(cell)
       tenlot = Trim(matches.Item(0))
    End With
End Function

Phải bẫy lỗi dhn46 ạ. Vì nếu chỉ có Họ và Tên - vd. Đỗ Mười - thì matches = Nothing
 
Upvote 0
Xin hỏi các anh chị ngoài cách dưới đây có cách nào dùng 1 Pattern để lấy được các ký tự bên trong của dấu cách đầu và dấu cách cuối để tách phần tên lót ra hay không?
PHP:
Function tenlot(cell As Range)
Dim ho As String, ten As String
   With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = ".*\s"
      ten = .Replace(Trim(cell), "")
      .Pattern = "\s.*"
      ho = .Replace(Trim(cell), "")
      tenlot = Application.Trim(Replace(Replace(cell, ho, ""), ten, ""))
   End With
End Function
Thuật toán của anh Hải có một vài chỗ chưa đúng. Do sử dụng phương thức Replace nên nếu rơi vào một trong các trường hợp sau đây kết quả sẽ không đúng:
1. Họ là chuỗi con của Tên ( Thị n)
2. Họ là chuỗi con của tên lót (Hồ Thị Hồng Hà)
3. Tên là chuỗi con của tên lót (Nguyễn Thị Thanh Thanh)

Tôi cũng viết thử một hàm 3 trong 1. Có thể tách họ, tên lót, tên.
[gpecode=vb]Function TachTen(Str As String, Optional Op As Long = 3)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "(\S+)( .+ | )(\S+$)"
TachTen = Trim(.Execute(Trim(Str))(0).SubMatches(Op - 1))
End With
End Function[/gpecode]
 
Upvote 0
Vbscript.RegExp quả là hay, với những bài toán tưởng chừng phải dùng vòng lặp duyệt toàn bộ mảng(chuỗi) thì giờ đây với công cụ này ta không cần lặp nhiều như thê nữa

Với suy nghĩ trên DHN46 có 1 câu hỏi kính mong các anh chị trợ giúp

Cho 1 chuỗi dạng: s = "12;34;12;A;23;B;B;12;45;AB;12"
Bằng Vbscript.RegExp hãy tách ra các phần tử trùng trong dãy

Xin cảm ơn!
 
Upvote 0
Vbscript.RegExp quả là hay, với những bài toán tưởng chừng phải dùng vòng lặp duyệt toàn bộ mảng(chuỗi) thì giờ đây với công cụ này ta không cần lặp nhiều như thê nữa

Với suy nghĩ trên DHN46 có 1 câu hỏi kính mong các anh chị trợ giúp

Cho 1 chuỗi dạng: s = "12;34;12;A;23;B;B;12;45;AB;12"
Bằng Vbscript.RegExp hãy tách ra các phần tử trùng trong dãy

Xin cảm ơn!

Tóm lại kết quả cuối cùng sẽ là cái gì?
 
Upvote 0
Kết quả mong muốn của em là mảng gồm các phần tử trùng lặp: 12,B

Bạn thử xem
[gpecode=vb]Function Test(Str As String, C As String) As String
Str = C & Replace(Str, C, C & C) & C
With CreateObject("VBScript.RegExp")
.Pattern = "(" & C & "[^" & C & "]+" & C & ").*\1"
Do While .Test(Str)
Test = Test & .Execute(Str)(0).SubMatches(0)
Str = Replace(Str, .Execute(Str)(0).SubMatches(0), "")
Loop
End With
Test = Replace(Mid(Test, 2, Len(Test) - 2), C & C, C)
End Function [/gpecode]
 
Upvote 0
hoặc

[GPECODE=vb]
Function tenlot1(cell As Range) As String
On Error Resume Next
With CreateObject("vbscript.regexp")
.Pattern = "\s.+\s"
tenlot1 = Trim(.Execute(Trim(cell)).Item(0).Value)
End With
End Function
[/GPECODE]

------------------
Ái chà.
Dạng 2 viết xong gửi lên mới thấy là giống cách của dhn46.
Coi như không tính cách 2.

Nhân tiện rảnh rỗi thử làm phức tạp vấn đề, làm rắc rối cách 2 xem sao

[GPECODE=vb]
Function tenlot(cell As Range) As String
On Error Resume Next
With CreateObject("vbscript.regexp")
.Pattern = "\s.+(?=\s)"
tenlot = Trim(.Execute(Trim(cell)).Item(0).Value)
End With
End Function
[/GPECODE]
------------------

Nếu là một hàm cho cả họ, tên, tên lót thì góp vui một code

[GPECODE=vb]
Function tachhoten(cell As Range, Optional ByVal index As Long = 3) As String
With CreateObject("vbscript.regexp")
.Pattern = "(\S+)(.*)(\s\S+)"
tachhoten = Trim(.Replace(Trim(cell), "$" & index))
End With
End Function
[/GPECODE]
 
Upvote 0
Sáng nay gởi bài lên GPE để hỏi mà đến giờ mới vào để xem đáp án.

Vô cùng cảm kích các anh chị đã post lời giải.

Qua bài này chúng ta (những bạn còn yếu về VBA như mình) chắn chắn đã học rất nhiều cái hay khi cần thiết lập 1 Pattern phù hợp với nhu cầu.
 
Upvote 0
Nếu là một hàm cho cả họ, tên, tên lót thì góp vui một code

[GPECODE=vb]
Function tachhoten(cell As Range, Optional ByVal index As Long = 3) As String
With CreateObject("vbscript.regexp")
.Pattern = "(\S+)(.*)(\s\S+)"
tachhoten = Trim(.Replace(Trim(cell), "$" & index))
End With
End Function
[/GPECODE]

Nghiên cứu phân tích hết cách vẫn không hiểu nổi thuật toán của code này.

Anh siwtom vui lòng dành ít thời gian giải thích giúp em nguyên tắc của thuật toán trong code này để em có thể ứng dụng trong những trường hợp khác
 
Upvote 0
Web KT
Back
Top Bottom