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í dụ nha, trong 1 cell có 2 đk cần thay thế, chuỗi là: Hoang:Trong=Nghia

Tôi muốn kết quả là Hoang Trong Nghia thì phải dùng Pattern như thế nào?

Chẳng lẽ phải dùng đến 2 lần Pattern?

R = "Hoang:Trong=Nghia"
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = ":"
R= .Replace(R), " ")
.Pattern = "="
R= .Replace(R, " ")
End With
Thì vầy thôi: .Pattern = "[:=]"
Cho phép tìm nhiều từ khóa cùng lúc mà
 
Upvote 0
Ví dụ nha, trong 1 cell có 2 đk cần thay thế, chuỗi là: Hoang:Trong=Nghia

Tôi muốn kết quả là Hoang Trong Nghia thì phải dùng Pattern như thế nào?

Chẳng lẽ phải dùng đến 2 lần Pattern?

R = "Hoang:Trong=Nghia"
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = ":"
R= .Replace(R), " ")
.Pattern = "="
R= .Replace(R, " ")
End With
Muốn bỏ mấy thằng không phải a-z, 0-9 thì thử dùng cái này xem sao:
.Pattern = "\W"
--------------
Ý cha!
Gặp mấy thằng chữ Việt có dấu là tèo luôn, "hổng được gồi".
 
Lần chỉnh sửa cuối:
Upvote 0
Thì vầy thôi: .Pattern = "[:=]"
Cho phép tìm nhiều từ khóa cùng lúc mà

Bây giờ có chuỗi là:

: A+B=C

Mình muốn loại bỏ những thứ màu xanh đi, thì Pattern có làm được 1 lần không? Dĩ nhiên với C là bất kỳ sau dấu =

Theo em nghĩ sẽ phải làm 2 lần pattern mới giải quyết được!

R = ": A+B=C"
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = ": "
R= .Replace(R), "")
.Pattern = "=.*"
R= .Replace(R, "")
End With
 
Lần chỉnh sửa cuối:
Upvote 0
Bây giờ có chuỗi là:

: A+B=C

Mình muốn loại bỏ những thứ màu xanh đi, thì Pattern có làm được 1 lần không? Dĩ nhiên với C là bất kỳ sau dấu =

Theo em nghĩ sẽ phải làm 2 lần pattern mới giải quyết được!

R = ": A+B=C"
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = ": "
R= .Replace(R), "")
.Pattern = "=.*"
R= .Replace(R, "")
End With

Hình nhử vầy nè anh ơi

With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "=.*|:"
R = .Replace(R, "")
End With
 
Upvote 0
Hình nhử vầy nè anh ơi

With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "=.*|:"
R = .Replace(R, "")
End With

Hiểu rồi, vậy dấu phân cách của nó ở đây: .Pattern = "=.*|:"

Chủ yếu mình muốn tìm là nó đấy! Cám ơn QuangHai nhiều nhé!
 
Upvote 0
Cho hỏi thêm 1 vấn đề:

Nếu có chuỗi là: Hoang Hoang Trong Nghia

Tôi muốn loại bỏ chữ Hoang đầu, có nghĩa rằng chuỗi nó gặp lần đầu thì nó sẽ loại ra, còn những chữ sau nó lướt qua, giống như cấu trúc của hàm Replace (phần count) của VBA vậy. Ta phải làm như thế nào?

Mở Immediate (Ctrl+G) và gõ cái này vào sẽ thấy hàm Replace của VBA nó hoạt động:

?Replace("Hoang Hoang Trong Nghia", "Hoang ", "", , 1)
 
Lần chỉnh sửa cuối:
Upvote 0
Hiểu rồi, vậy dấu phân cách của nó ở đây: .Pattern = "=.*|:"

Chủ yếu mình muốn tìm là nó đấy! Cám ơn QuangHai nhiều nhé!

Nói thêm: cái dấu | hổng phải là dấu phân cách. Nó có ý nghĩa là OR ---> X|Y nghĩa là Match X OR Match Y
Có vẻ như Nghĩa đang "dự tính" làm bài toán có liên quan đến dự toán đây (biến biểu thức thành giá trị)
 
Upvote 0
Nói thêm: cái dấu | hổng phải là dấu phân cách. Nó có ý nghĩa là OR ---> X|Y nghĩa là Match X OR Match Y
Có vẻ như Nghĩa đang "dự tính" làm bài toán có liên quan đến dự toán đây (biến biểu thức thành giá trị)

Vậy nếu nó là OR thì AND của nó là gì ạ?
 
Upvote 0
Cho hỏi thêm 1 vấn đề:

Nếu có chuỗi là: Hoang Hoang Trong Nghia

Tôi muốn loại bỏ chữ Hoang đầu, có nghĩa rằng chuỗi nó gặp lần đầu thì nó sẽ loại ra, còn những chữ sau nó lướt qua, giống như cấu trúc của hàm Replace (phần count) của VBA vậy. Ta phải làm như thế nào?

Mở Immediate (Ctrl+G) và gõ cái này vào sẽ thấy hàm Replace của VBA nó hoạt động:

?Replace("Hoang Hoang Trong Nghia", "Hoang ", "", , 1)
Làm thế này
Mã:
Dim R
With CreateObject("vbscript.regexp")
.Global = False
.Pattern = "[A-Za-z]+\s"
R = .Replace([A1], "")
End With
Với [A1] chứa chuỗi
Bài toán diễn giải công thức mà chơi em này thì tuyệt vời
Đề bài là dữ liệu không dấu tiếng Việt, nếu có dấu phải chơi kiểu khác nhé
Vậy nếu nó là OR thì AND của nó là gì ạ?
Không có And, tức là muốn Pattern thế nào thì cứ thế ....mà phang tới tới thôi
Híc
 
Lần chỉnh sửa cuối:
Upvote 0
Làm thế này
Mã:
Dim R
With CreateObject("vbscript.regexp")
.Global = False
.Pattern = "[A-Za-z]+\s"
R = .Replace([A1], "")
End With
Với [A1] chứa chuỗi
Bài toán diễn giải công thức mà chơi em này thì tuyệt vời

Hay lắm, nhưng diễn giải cái chỗ .Pattern = "[A-Za-z]+\s" thì sẽ như thế nào?

[A-Za-z]: Ký tự từ A đến Z (hoa và thường)

Còn cái này là gì? +\s
 
Upvote 0
Vậy nếu nó là OR thì AND của nó là gì ạ?

Hỏi gì vậy trời?
X AND Y thì viết là XY thôi
-------------------
Làm thế này
Mã:
Dim R
With CreateObject("vbscript.regexp")
.Global = False
[COLOR=#ff0000][B].Pattern = "[A-Za-z]+\s"[/B][/COLOR]
R = .Replace([A1], "")
End With
Với [A1] chứa chuỗi
Vầy cũng được nè: .Pattern = "[\w]{1,}"
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
Hay lắm, nhưng diễn giải cái chỗ .Pattern = "[A-Za-z]+\s" thì sẽ như thế nào?

[A-Za-z]: Ký tự từ A đến Z (hoa và thường)

Còn cái này là gì? +\s
Cái đó là cái ....khoảng trắng, nếu không có nó thì kết quả sẽ có 1 em trắng trẻo ở đầu cell
Híc
Vầy cũng được nè: .Pattern = "[\w]{1,}"
Ẹc... Ẹc...
Nói chung cái Pattern có nhiều cách viết và cũng.....cực khó
Hình như chỉ có bạn siwtom là rành cái này
 
Lần chỉnh sửa cuối:
Upvote 0
Hỏi gì vậy trời?
X AND Y thì viết là XY thôi
-------------------

Vầy cũng được nè: .Pattern = "[\w]{1,}"
Ẹc... Ẹc...

Có cảm giác điều kiện cũng giống toán tử LIKE nhỉ? Tuy nhiên có dấu tiếng Việt UNI chắc phải có gì khác chứ nhỉ?
 
Upvote 0
Upvote 0

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    35.9 KB · Đọc: 216
Upvote 0
Toàn bộ file CHM đều bị vậy hay chỉ có file này thôi?
Nghĩa search googe từ khóa CHM file error "Navigation to the webpage was canceled" xem


OK! đã làm cho nó đọc được! Mới thực hiện ở bước 2

Step 1:


a. Click Start, type cmd, right-click and select Run as administrator.
b. Enter the following command and hit Enter:

regsvr32 hhctrl.ocx

After getting the success message "DllRegisterServer in hhctrl.ocx succeeded", try to open your CHM file again.

Step 2:

If you are sure that the help documentation is from a trusted source, try and open it by following the below steps:

a. Right-click the CHM file and click “Properties”.
b. In the “General” tab of the “Properties” dialog box, click the “Unblock” button under “Security” at the bottom.
c. Click “Apply” and “OK” to save the settings.

Try opening the .CHM files and check if that fixes the issue.

Step 3: Perform a System File Checker (SFC) scan

SFC toolscans system files and replaces incorrect versions of the system files by using the correct versions.
 
Upvote 0
Tôi hiểu là Nghĩa muốn loại từ khi nó bị lặp ở vị trí bất kỳ (vì ở ngay đầu thì dễ quá)? Nếu thế thì pattern của concogia không làm được. Vì ở vd. cụ thể thì Hoang được lặp mà nó lại đứng đầu. Nếu có "Trong Nghia Hoang Hoang" thì ta sẽ được "Nghia Hoang Hoang"
Nhìn pattern thì biết nó luôn loại 1 (vì Global = FALSE) từ đứng ởđầu chuỗi.

Câu hỏi:
Loại từ - tức cụm ký tự thuộc [A-Za-z_] - được lặp lại liền nhau.

Chuỗi tổng quát:
"nhiều từ (1 hoặc nhiều dấu cách) (cụm abc...xyz) (1 hoặc nhiều dấu cách) (cụm abc...xyz) (1 hoặc nhiều dấu cách) nhiều từ"

Yêu lầu: loại 1 (cụm abc...xyz) - (cụm abc...xyz) là một từ nào đó
 
Upvote 0
Tôi hiểu là Nghĩa muốn loại từ khi nó bị lặp ở vị trí bất kỳ (vì ở ngay đầu thì dễ quá)? Nếu thế thì pattern của concogia không làm được. Vì ở vd. cụ thể thì Hoang được lặp mà nó lại đứng đầu. Nếu có "Trong Nghia Hoang Hoang" thì ta sẽ được "Nghia Hoang Hoang"
Nhìn pattern thì biết nó luôn loại 1 (vì Global = FALSE) từ đứng ởđầu chuỗi.

Câu hỏi:
Loại từ - tức cụm ký tự thuộc [A-Za-z_] - được lặp lại liền nhau.

Chuỗi tổng quát:
"nhiều từ (1 hoặc nhiều dấu cách) (cụm abc...xyz) (1 hoặc nhiều dấu cách) (cụm abc...xyz) (1 hoặc nhiều dấu cách) nhiều từ"

Yêu lầu: loại 1 (cụm abc...xyz) - (cụm abc...xyz) là một từ nào đó
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!
 
Upvote 0
Web KT
Back
Top Bottom