Tách chuỗi ký tự thỏa mãn 1 pattern cho trước

Liên hệ QC

killitmore

Thành viên hoạt động
Tham gia
8/12/14
Bài viết
165
Được thích
72
Hiện tại em đang cần tạo 1 hàm trả về các hạng tử tham gia vào 1 biểu thức tính toán.
Ví dụ: hàm tên là lay_hang_tu, tham số đầu vào là 1 chuỗi ký tự thì
lay_hang_tu("CRS_CDS_VN*2+BOND_DISC_ZC*0.8+CRS_BANK_AA") sẽ trả về 1 mảng (Array) gồm 3 chuỗi ký tự:
("CRS_CDS_VN","BOND_DISC_ZC","CRS_BANK_AA") (các hạng tử tham gia vào trong phép tính đều có dạng chỉ bao gồm: chữ cái viết hoa và dấu "_".

Mong mọi người giúp đỡ lập hàm này. Em thử dùng toán tử Like mà chưa ra.
 
Hiện tại em đang cần tạo 1 hàm trả về các hạng tử tham gia vào 1 biểu thức tính toán.
Ví dụ: hàm tên là lay_hang_tu, tham số đầu vào là 1 chuỗi ký tự thì
lay_hang_tu("CRS_CDS_VN*2+BOND_DISC_ZC*0.8+CRS_BANK_AA") sẽ trả về 1 mảng (Array) gồm 3 chuỗi ký tự:
("CRS_CDS_VN","BOND_DISC_ZC","CRS_BANK_AA") (các hạng tử tham gia vào trong phép tính đều có dạng chỉ bao gồm: chữ cái viết hoa và dấu "_".

Mong mọi người giúp đỡ lập hàm này. Em thử dùng toán tử Like mà chưa ra.
Dạng này thì bạn nên dùng Regexp:
PHP:
Function lay_hang_tu(str As String)
Dim result(), item
str = str & "+"
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "([A-Z\_]+)(\*[\d\.]+)?\+"
    ReDim result(.Execute(str).Count)
    For i = 0 To .Execute(str).Count - 1
        result(i) = .Execute(str).item(i).submatches(0)
    Next
End With
lay_hang_tu = result
End Function
Hoặc dùng Plit
PHP:
Function lay_hang_tu2(str As String)
Dim result, result2(), item
str = Replace(str, "+", "*+") & "*"
result = Split(str, "+")
ReDim result1(UBound(result))
For i = 0 To UBound(result)
   result1(i) = Split(result(i), "*")(0)
Next i
lay_hang_tu2 = result1
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện tại em đang cần tạo 1 hàm trả về các hạng tử tham gia vào 1 biểu thức tính toán.
Ví dụ: hàm tên là lay_hang_tu, tham số đầu vào là 1 chuỗi ký tự thì
lay_hang_tu("CRS_CDS_VN*2+BOND_DISC_ZC*0.8+CRS_BANK_AA") sẽ trả về 1 mảng (Array) gồm 3 chuỗi ký tự:
("CRS_CDS_VN","BOND_DISC_ZC","CRS_BANK_AA") (các hạng tử tham gia vào trong phép tính đều có dạng chỉ bao gồm: chữ cái viết hoa và dấu "_".

Mong mọi người giúp đỡ lập hàm này. Em thử dùng toán tử Like mà chưa ra.
Với mẫu của bạn
Mã:
Option Explicit

Function lay_hang_tu(str As String)
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "\*[^A-Z]+"
    lay_hang_tu = .Replace(str, ", ")
End With
End Function
 
Upvote 0
Với mẫu của bạn
Mã:
Option Explicit

Function lay_hang_tu(str As String)
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "\*[^A-Z]+"
    lay_hang_tu = .Replace(str, ", ")
End With
End Function
Hình như tác giả yêu cầu trả về mảng.
Bạn thử với chuỗi này xem
CRS_CDS_VN*2+BOND_DISC_ZC+CRS_BANK_AA
 
Upvote 0
Thấy kết quả đúng đầu bài rồi mà.
Chuỗi của bạn đâu có giống chuỗi bài 1
hic, tôi thấy bài 1 yêu cầu trả về array với 3 phần tử, mà tôi thấy function của bạn trả về một chuỗi String, không biết tôi có nhầm lẫn gì không?
Chuỗi tôi đưa cũng thuộc dạng bài 1, dấu * có thể có hoặc không, bạn xem đoạn chuỗi cuối cùng của bài 1 đâu có dấu * .
 
Upvote 0
hic, tôi thấy bài 1 yêu cầu trả về array với 3 phần tử, mà tôi thấy function của bạn trả về một chuỗi String, không biết tôi có nhầm lẫn gì không?
Bài 1 yêu cầu trả về (... , ..., ...) thì kết quả trả đúng vậy.
Bạn nhầm hay không để thớt trả lời
Chuỗi tôi đưa cũng thuộc dạng bài 1, dấu * có thể có hoặc không, bạn xem đoạn chuỗi cuối cùng của bài 1 đâu có dấu * .
Bạn nhận xét sai rồi.
Chuỗi bài 1 : Trừ cụm ký tự cuối cùng, tất cả các cụm còn là đều có dầu *
Cái này cũng cứ để thớt trả lời.

Dạng bài này dùng reg thì không cần đến vòng lặp đâu bạn bất kể kết quả mong muốn là array hoặc string
 
Upvote 0
Bài 1 yêu cầu trả về (... , ..., ...) thì kết quả trả đúng vậy.
Bạn nhầm hay không để thớt trả lời

Bạn nhận xét sai rồi.
Chuỗi bài 1 : Trừ cụm ký tự cuối cùng, tất cả các cụm còn là đều có dầu *
Cái này cũng cứ để thớt trả lời.

Dạng bài này dùng reg thì không cần đến vòng lặp đâu bạn bất kể kết quả mong muốn là array hoặc string
Có lẽ do vấn đề của bài chưa rõ ràng nên mỗi người đọc hiểu khác nhau.
Bạn đi theo huớng này thì không cần dùng vòng lặp cũng được dùng split String thì ra mảng . Dạng chuỗi thì để chủ topic trả lời vậy.
 
Upvote 0
Thầy bói mù, rờ voi mà bàn như sau:
Cách replace hiệu quả hơn, nhưng đó là với điều kiện chuỗi lý tưởng như chủ thớt đưa ra.
Nếu chuỗi không lý tưởng, ví dụ bắt đầu hoặc kết thúc bằng 1 chữ số, thì cách replace còn phải thêm phần loại bớt rác.
 
Upvote 0
Bài 4 dùng Pattern như sau có lẽ phù hợp hơn.
PHP:
Function lay_hang_tu(str As String)
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "[^A-Z_]+"
    lay_hang_tu = Trim(.Replace(str, " "))
End With
End Function
Mảng thì thêm hàm Split.
 
Upvote 0
Web KT
Back
Top Bottom