Nhờ giúp đỡ code chuyển đổi chuỗi ký tự

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Eric.Shen

Thành viên chính thức
Tham gia
26/1/23
Bài viết
74
Được thích
9
Chào các bác,
Hôm nay em lại có một bài toán khá là phức tạp, dạng chuyển đổi chuỗi ký tự
Trong một chuỗi ký tự
- Nếu ký tự là số thì chuyển thành [0-9] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: 123 sẽ đổi thành [0-9]{3}
- Nếu ký tự là chữ thì chuyển thành [A-Z] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: AbCd sẽ đổi thành [A-Z]{4}, không phân biệt chữ hoa, chữ thường
- Nếu ký tự là ký tự đặc biệt (bất kỳ ký tự nào khác chữ và khác số ) thì đều chuyển thành [\W] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: :# sẽ đổi thành [\W]{2}

Cụ thể hơn em có ví dụ trong tệp đính kèm, các bác nghiên cứu giúp em với nhé
 

File đính kèm

  • Chuyen doi chuoi ky tu.xlsb
    8.9 KB · Đọc: 23
Code
Mã:
Function Chuyen_doi_theo_yeu_cau(inputString As String) As String
    Dim result As String
    Dim i As Integer
    Dim char As String
    Dim count As Integer
    Dim isCharAlpha As Boolean
    
    i = 1
    Do While i <= Len(inputString)
        char = Mid(inputString, i, 1)
        isCharAlpha = IsAlpha(char)
        
        If IsNumeric(char) Then
            count = 1
            For j = i + 1 To Len(inputString)
                If IsNumeric(Mid(inputString, j, 1)) Then
                    count = count + 1
                Else
                    Exit For
                End If
            Next j
            result = result & "[0-9]{" & count & "}"
        ElseIf isCharAlpha Then
            count = 1
            For j = i + 1 To Len(inputString)
                If IsAlpha(Mid(inputString, j, 1)) Then
                    count = count + 1
                Else
                    Exit For
                End If
            Next j
            result = result & "[A-Z]{" & count & "}"
        Else
            count = 1
            For j = i + 1 To Len(inputString)
                If Not (IsNumeric(Mid(inputString, j, 1)) Or IsAlpha(Mid(inputString, j, 1))) Then
                    count = count + 1
                Else
                    Exit For
                End If
            Next j
            result = result & "[\W]{" & count & "}"
        End If
        i = i + count
    Loop
    
    Chuyen_doi_theo_yeu_cau = "(" & result & ")"
End Function

Function IsAlpha(char As String) As Boolean
    IsAlpha = char Like "[A-Za-z]"
End Function
Cách sử dụng:
=Chuyen_doi_theo_yeu_cau(dữ liệu)
VD:
Mã:
=Chuyen_doi_theo_yeu_cau(A1)
 
Upvote 0
Code
Mã:
Function Chuyen_doi_theo_yeu_cau(inputString As String) As String
    Dim result As String
    Dim i As Integer
    Dim char As String
    Dim count As Integer
    Dim isCharAlpha As Boolean
   
    i = 1
    Do While i <= Len(inputString)
        char = Mid(inputString, i, 1)
        isCharAlpha = IsAlpha(char)
       
        If IsNumeric(char) Then
            count = 1
            For j = i + 1 To Len(inputString)
                If IsNumeric(Mid(inputString, j, 1)) Then
                    count = count + 1
                Else
                    Exit For
                End If
            Next j
            result = result & "[0-9]{" & count & "}"
        ElseIf isCharAlpha Then
            count = 1
            For j = i + 1 To Len(inputString)
                If IsAlpha(Mid(inputString, j, 1)) Then
                    count = count + 1
                Else
                    Exit For
                End If
            Next j
            result = result & "[A-Z]{" & count & "}"
        Else
            count = 1
            For j = i + 1 To Len(inputString)
                If Not (IsNumeric(Mid(inputString, j, 1)) Or IsAlpha(Mid(inputString, j, 1))) Then
                    count = count + 1
                Else
                    Exit For
                End If
            Next j
            result = result & "[\W]{" & count & "}"
        End If
        i = i + count
    Loop
   
    Chuyen_doi_theo_yeu_cau = "(" & result & ")"
End Function

Function IsAlpha(char As String) As Boolean
    IsAlpha = char Like "[A-Za-z]"
End Function
Cách sử dụng:
=Chuyen_doi_theo_yeu_cau(dữ liệu)
VD:
Mã:
=Chuyen_doi_theo_yeu_cau(A1)
đúng luôn với mong muốn của em viết ra rồi ạ, em cứ lo là bài toán này nó quá phức tạp
Thật sự cảm ơn bác rất nhiều ạ
 
Upvote 0
Chào các bác,
Hôm nay em lại có một bài toán khá là phức tạp, dạng chuyển đổi chuỗi ký tự
Trong một chuỗi ký tự
- Nếu ký tự là số thì chuyển thành [0-9] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: 123 sẽ đổi thành [0-9]{3}
- Nếu ký tự là chữ thì chuyển thành [A-Z] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: AbCd sẽ đổi thành [A-Z]{4}, không phân biệt chữ hoa, chữ thường
- Nếu ký tự là ký tự đặc biệt (bất kỳ ký tự nào khác chữ và khác số ) thì đều chuyển thành [\W] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: :# sẽ đổi thành [\W]{2}

Cụ thể hơn em có ví dụ trong tệp đính kèm, các bác nghiên cứu giúp em với nhé
Góp vui . . .·
Mã:
Option Explicit
Option Compare Text

Function ChuyenMa(ByVal str As String) As String
  Dim a, b&(), i&, j&, k&, N&, t&, char$, res$
 
  a = Array("", "[0-9]", "[A-Z]", "[\W]")
  N = Len(str)
  ReDim b(1 To N + 1)
  b(N + 1) = 9
 
  For i = 1 To N
    char = Mid(str, i, 1)
    For j = 1 To 2
      If char Like a(j) Then Exit For
    Next j
    b(i) = j
  Next i
 
  For i = 1 To N
    If t <> b(i) Then
      t = b(i)
      res = res & a(t)
      k = 1
    End If
    If t <> b(i + 1) Then
      res = res & "{" & k & "}"
    Else
      k = k + 1
    End If
  Next i
  If Len(res) Then ChuyenMa = "(" & res & ")"
End Function
 
Upvote 0
Nếu cần về độ chính xác và nhanh thì Eric.Shen nên dùng code của bài #4 của anh HieuCD nhé.
Code bài #2 chỉ là chữa cháy thôi.
Anh Hieu CD là một trong những thành viên kỳ cựu của GPE.
Code của anh ấy luôn là sự lựa chọn tốt.
 
Upvote 0
Góp vui . . .·
Mã:
Option Explicit
Option Compare Text

Function ChuyenMa(ByVal str As String) As String
  Dim a, b&(), i&, j&, k&, N&, t&, char$, res$
 
  a = Array("", "[0-9]", "[A-Z]", "[\W]")
  N = Len(str)
  ReDim b(1 To N + 1)
  b(N + 1) = 9
 
  For i = 1 To N
    char = Mid(str, i, 1)
    For j = 1 To 2
      If char Like a(j) Then Exit For
    Next j
    b(i) = j
  Next i
 
  For i = 1 To N
    If t <> b(i) Then
      t = b(i)
      res = res & a(t)
      k = 1
    End If
    If t <> b(i + 1) Then
      res = res & "{" & k & "}"
    Else
      k = k + 1
    End If
  Next i
  If Len(res) Then ChuyenMa = "(" & res & ")"
End Function
Em cảm ơn bác rất nhiều ạ, em mới tự học được một chút về VBA, những bài toán thế này với em thực sự quá phức tạp mà câu lệnh của bác lại giải quyết dễ dàng. Em sẽ cố gắng để hiểu nó ạ
Bài đã được tự động gộp:

Nếu cần về độ chính xác và nhanh thì Eric.Shen nên dùng code của bài #4 của anh HieuCD nhé.
Code bài #2 chỉ là chữa cháy thôi.
Anh Hieu CD là một trong những thành viên kỳ cựu của GPE.
Code của anh ấy luôn là sự lựa chọn tốt.
Vâng, em cảm ơn bác ạ
Em cũng đang tự học dần, những code các bác giúp em đều là những kiến thức rất bổ ích cho em ạ
 
Upvote 0
Căn bản bài toán là chuyển đổi nhóm ký tự thành dạng Regex.
Như vậy code có thể dùng Regex để lấy từng cụm.
Cụm ký tự chữ [A-Za-z]+
Cụm ký tự số \d+
Cụm ký tự khác [^A-Za-z\d]
Cứ lấy từng submatch, lấy len rồi ghi thành:
Replace("[A-Z]{?}", "?", LEN(chuỗi))
Replace("[0-9]{?}", "?", LEN(chuỗi))
Replace("[\W]{?}", "?", LEN(chuỗi))
 
Upvote 0
Căn bản bài toán là chuyển đổi nhóm ký tự thành dạng Regex.
Như vậy code có thể dùng Regex để lấy từng cụm.
Cụm ký tự chữ [A-Za-z]+
Cụm ký tự số \d+
Cụm ký tự khác [^A-Za-z\d]
Cứ lấy từng submatch, lấy len rồi ghi thành:
Replace("[A-Z]{?}", "?", LEN(chuỗi))
Replace("[0-9]{?}", "?", LEN(chuỗi))
Replace("[\W]{?}", "?", LEN(chuỗi))
vâng bác,
hiện tại em chưa hiểu được, nhưng sẽ cố gắng tìm hiểu thêm ạ
 
Upvote 0
Chào các bác,
Hôm nay em lại có một bài toán khá là phức tạp, dạng chuyển đổi chuỗi ký tự
Trong một chuỗi ký tự
- Nếu ký tự là số thì chuyển thành [0-9] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: 123 sẽ đổi thành [0-9]{3}
- Nếu ký tự là chữ thì chuyển thành [A-Z] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: AbCd sẽ đổi thành [A-Z]{4}, không phân biệt chữ hoa, chữ thường
- Nếu ký tự là ký tự đặc biệt (bất kỳ ký tự nào khác chữ và khác số ) thì đều chuyển thành [\W] sau đó đếm số lượng ký tự của nó và đặt trong ngoặc nhọn {}; ví dụ: :# sẽ đổi thành [\W]{2}

Cụ thể hơn em có ví dụ trong tệp đính kèm, các bác nghiên cứu giúp em với nhé
Góp vui với 1 hàm CountChar của tác giả @ NDu:
Mã:
Option Explicit
Function CountChar(text As String, iType As String) As Long
  Dim Tmp As String
  Tmp = Switch(iType = "L", "[^a-zA-Z]", iType = "N", "[^0-9]", iType = "S", "[0-9a-zA-Z]")
  With CreateObject("VBScript.RegExp")
    .Global = True: .Pattern = Tmp
    CountChar = Len(.Replace(text, ""))
  End With
End Function
Cú pháp:
B3="[0-9]" & "{" &CountChar($A3;"N") & "}" nếu là đếm số
B3="[A-z]" & "{" &CountChar($A3;"L") & "}" nếu là đếm chữ,
và tương tự cho phần đếm ký tự đặc biệt.
 
Upvote 0
Nghe giống chuyển về dạng pattern Regex nhỉ
 
Upvote 0
Web KT

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

Back
Top Bottom