Hỏi về hàm Replace (1 người xem)

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

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

YenLV

Thành viên chính thức
Tham gia
28/12/11
Bài viết
69
Được thích
14
Anh/ chị chỉ giúp em làm thế nào chỉ replace "*" và "/" nội dung trong dấu ngoặc ( ) bằng "x" và ":" ví dụ như sau:
Đầu vào 2*(1+1*12)*(2+2*2)*(3*2/10)/100
Kết quả 2*(1+1x12)*(2+2x2)*(3x2:10)/100
 
Thành trong: (((3,0+0,76-0,11)*2)+(6,0+0,76*2))*0,65/100 = 0,096
Kết quả là gì
 
Nội dung =0,096 hoặc tương tự là do em copy từ file người đi trước làm bằng phần mềm dự toán ra nó có kết quả tính toán của dãy số đó, cái đó em chưa xóa hết ạ. Em mong muốn bổ sung ở cột D tách sau dấu : và bỏ kí tự từ sau dấu "=" đi ạ.
 
Lần chỉnh sửa cuối:
Mình muốn biết kết quả cụ thể: là
(((3,0+0,76-0,11)*2)+(6,0+0,76*2))*0,65/100
Hay
1*(((3,0+0,76-0,11)*2)+(6,0+0,76*2))*0,65/100
Hay kết quả khác
 
Xem cách dùng Function trong file
Mã:
Function BieuThuc(ByVal iStr As String, Optional ByVal iType As Byte = 0) As String
  Dim tmp As String, n As Byte, k As Byte
  Dim i As Integer, d As Integer, iFist As Integer, iLast As Integer
 
  iFist = InStr(1, iStr, ":") + 1
  If iFist > 1 Then iFist = iFist + 1
  If Mid(iStr, iFist, 1) = "-" Then iFist = iFist + 1
  iLast = InStr(1, iStr, "=") - 2
  If iLast = -2 Then iLast = Len(iStr)
  If iLast < iFist Then BieuThuc = "": Exit Function
  iStr = Mid(iStr, iFist, iLast - iFist + 1)
 
  d = Len(iStr)
  iFist = InStr(1, iStr, "(")
  Do While iFist > 0
    k = 0
    For i = iFist To d
      If Mid(iStr, i, 1) = "(" Then
        k = k + 1
      ElseIf Mid(iStr, i, 1) = ")" Then
        k = k - 1
        If k = 0 Then iFist = InStr(i + 1, iStr, "("): Exit For
      ElseIf Mid(iStr, i, 1) = "*" Then
        Mid(iStr, i, 1) = "x"
      ElseIf Mid(iStr, i, 1) = "/" Then
        Mid(iStr, i, 1) = ":"
      End If
    Next i
  Loop
 
  n = Len(iStr) - Len(Replace(iStr, "*", ""))
  If n = 1 Then tmp = "1*1*" Else If n = 2 Then tmp = "1*"
  tmp = tmp & iStr
  Select Case iType
    Case 1
      BieuThuc = Split(tmp, "*")(0)
    Case 2
      BieuThuc = Split(tmp, "*")(1)
    Case 3
      BieuThuc = Split(tmp, "*")(2)
    Case 4
      BieuThuc = Split(Split(tmp, "*")(3), "/")(0)
    Case 5
      BieuThuc = Split(Split(tmp, "*")(3), "/")(1)
    Case Else
      BieuThuc = tmp
  End Select
End Function
 

File đính kèm

Xem cách dùng Function trong file
Mã:
Function BieuThuc(ByVal iStr As String, Optional ByVal iType As Byte = 0) As String
  Dim tmp As String, n As Byte, k As Byte
  Dim i As Integer, d As Integer, iFist As Integer, iLast As Integer

  iFist = InStr(1, iStr, ":") + 1
  If iFist > 1 Then iFist = iFist + 1
  If Mid(iStr, iFist, 1) = "-" Then iFist = iFist + 1
  iLast = InStr(1, iStr, "=") - 2
  If iLast = -2 Then iLast = Len(iStr)
  If iLast < iFist Then BieuThuc = "": Exit Function
  iStr = Mid(iStr, iFist, iLast - iFist + 1)

  d = Len(iStr)
  iFist = InStr(1, iStr, "(")
  Do While iFist > 0
    k = 0
    For i = iFist To d
      If Mid(iStr, i, 1) = "(" Then
        k = k + 1
      ElseIf Mid(iStr, i, 1) = ")" Then
        k = k - 1
        If k = 0 Then iFist = InStr(i + 1, iStr, "("): Exit For
      ElseIf Mid(iStr, i, 1) = "*" Then
        Mid(iStr, i, 1) = "x"
      ElseIf Mid(iStr, i, 1) = "/" Then
        Mid(iStr, i, 1) = ":"
      End If
    Next i
  Loop

  n = Len(iStr) - Len(Replace(iStr, "*", ""))
  If n = 1 Then tmp = "1*1*" Else If n = 2 Then tmp = "1*"
  tmp = tmp & iStr
  Select Case iType
    Case 1
      BieuThuc = Split(tmp, "*")(0)
    Case 2
      BieuThuc = Split(tmp, "*")(1)
    Case 3
      BieuThuc = Split(tmp, "*")(2)
    Case 4
      BieuThuc = Split(Split(tmp, "*")(3), "/")(0)
    Case 5
      BieuThuc = Split(Split(tmp, "*")(3), "/")(1)
    Case Else
      BieuThuc = tmp
  End Select
End Function

--> Anh @HieuCD
Mấy cái này Regular Expression chứ
Vì nó là chuẩn hóa Chuỗi hầu như tất cả ngôn ngữ





 
--> Anh @HieuCD
Mấy cái này Regular Expression chứ
Vì nó là chuẩn hóa Chuỗi hầu như tất cả ngôn ngữ
Bài này thì đúng là nên dùng regexp, nhưng không dễ ăn, bạn có cách nào khác dùng regexp cho tôi tham khảo với.
PHP:
Function repl(ByVal str As String, ByVal n As Long) As String
    Static reg As Object
    str = StrReverse(str)
    If reg Is Nothing Then Set reg = CreateObject("vbscript.regexp")
    reg.Pattern = "(?:([\d\,]+))(?:\/(\).*\(|[\d\,]+))" & Application.Rept("(?:\*(\).*\(|[\d\,]+))?", 3)
    If reg.test(str) Then
        repl = Replace(Replace(StrReverse(reg.Execute(str)(0).SubMatches(5 - n)), "*", "x"), "/", ":")
        If repl = Empty Then repl = 1
    Else
        repl = ""
    End If
End Function
 

File đính kèm

Cám ơn các anh ạ !
 
Lần chỉnh sửa cuối:
Lúc đầu chưa biết nhìn thì rối thật nhưng sau khi đã học sâu thì tuyệt vời.
Dữ liệu ở đây không hoàn toàn chuẩn. Nếu đạt đến trình độ lập mẫu pattern động, uyển chuyển thì mới xứng đáng từ "tuyệt vời".
Chưa đạt đến trình độ đó thì dùng kỹ thuật parse token cũng vậy.
 
Web KT

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

Back
Top Bottom