Loại bỏ phần trùng lặp trong 1 chuỗi (1 người xem)

  • Thread starter Thread starter lq177
  • Ngày gửi Ngày gửi
Liên hệ QC

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

lq177

Thành viên thường trực
Tham gia
22/4/10
Bài viết
203
Được thích
112
Mình có 1 chuỗi như sau
k= ",2,2,4,5,c,b,c,2"
Mình muốn loại bỏ dấu phẩy đầu tiên, và các ký tự bị trùng lặp
kết quả mong muốn là
k= "2,4,5,c,b"
Mong các bạn giúp đỡ
 
Function LoaiTrung(ByVal str As String) As String
' ham thu gon chuoi bang cach loai cac chuoi con trung
Const DELIM = ","
Const DUMMY = "#"
Do While Left(str, 1) = DELIM ' vong lap loai dau phay o dau
Mid(str, 1, 1) = " "
Loop
Dim a As Variant, i As Integer
a = Split(Trim(str), DELIM) ' tach ra tung thanh phan
For i = UBound(a) To 0 Step -1 ' tim tu phai qua trai, xoa neu trung
If Application.Match(a(i), a, 0) <= i Then a(i) = DUMMY
Next i
LoaiTrung = Replace(Join(a, DELIM), DELIM & DUMMY, "")
End Function
 
Upvote 0
Mình có 1 chuỗi như sau
k= ",2,2,4,5,c,b,c,2"
Mình muốn loại bỏ dấu phẩy đầu tiên, và các ký tự bị trùng lặp
kết quả mong muốn là
k= "2,4,5,c,b"
Mong các bạn giúp đỡ
Bạn dùng function này:
PHP:
Function reg(str As String)
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "((\,\w).*)\2"
    Do While .test(str)
        str = .Replace(str, "$1")
    Loop
End With
reg = Mid(str, 2, 1000)
End Function
 
Upvote 0
Bạn dùng function này:
PHP:
Function reg(str As String)
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "((\,\w).*)\2"
    Do While .test(str)
        str = .Replace(str, "$1")
    Loop
End With
reg = Mid(str, 2, 1000)
End Function
Tôi tưởng RegExp sẽ khỏi cần vòng lập chứ (thế mới tuyệt chiêu)
Còn đã dùng vòng lập rồi thì cách thông thường cũng xong
 
Upvote 0
Tôi tưởng RegExp sẽ khỏi cần vòng lập chứ (thế mới tuyệt chiêu)
Còn đã dùng vòng lập rồi thì cách thông thường cũng xong
Tôi không nghĩ ra cách nào dùng reg không dùng vòng lặp cho bài này, chắc tại học chưa tới, bạn cho tôi đoạn code dùng reg không dùng vòng lặp được không?
 
Upvote 0
Khá lâu rồi tôi có viết hàm dạng này dùng cho trường hợp tổng quát
Mã:
Function StrUnique(ByVal Text As String, Optional ByVal Delimiter As String = vbNullString) As String
  Dim n As Long, arrTmp
  'On Error Resume Next
  If Delimiter = vbNullString Then
    StrUnique = Left(Text, 1)
    For n = 1 To Len(Text)
      If InStr(StrUnique, Mid(Text, n, 1)) = 0 Then StrUnique = StrUnique & Mid(Text, n, 1)
    Next n
  Else
    arrTmp = Split(Replace(Text, Delimiter, Space(1)), Space(1))
    With CreateObject("Scripting.Dictionary")
      For n = 0 To UBound(arrTmp)
        If Len(arrTmp(n)) Then
          If Not .Exists(arrTmp(n)) Then .Add arrTmp(n), Nothing
        End If
      Next n
      StrUnique = Join(.Keys, Delimiter)
    End With
  End If
End Function
Cú pháp:
Mã:
StrUnique(chuỗi đầu vào, [dấu phân cách]
Nếu không truyền vào đối số dấu phân cách thì có nghĩa là lọc duy nhất theo từng ký tự
Nếu có đối số dấu phân cách: sẽ tách chuỗi thành mảng (theo dấu phân cách) rồi lọc duy nhất, sau đó nối chuỗi lại
-------------------------------------------
Tôi không nghĩ ra cách nào dùng reg không dùng vòng lặp cho bài này, chắc tại học chưa tới, bạn cho tôi đoạn code dùng reg không dùng vòng lặp được không?
RegExp không phải là thế mạnh của tôi (nói trắng ra là tôi không rành nó)
Ở đây tôi chỉ có ý kiến rằng: Đã dùng RegExp thì ta phải chắc rằng đối với bài toán này nó có cách xử lý hay hơn. Còn không thì thôi dùng cách thông thường
 

File đính kèm

Upvote 0
Cám ơn các bác đã nhiệt tình, giúp đỡ. Cám ơn trước thử sau
Một lần nữa cám ơn
 
Upvote 0
Web KT

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

Back
Top Bottom