上一節中我們講過了正則表示式的基礎語法,舉了一個例子,把A列資料各個部門中的門字去掉,當時寫的程式碼中:
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "門"
End With
.Pattern = "門",此表示式中的“門”字就是一個普通字元,如果表示式中只是用普通字元的話,那我們用查詢功能完全可以匹配目標字串,為何還要寫程式碼呢?所以正則表示式中還有另外一種字元,叫做元字元。
比如我們在查詢時通常會用萬用字元“*”表示任意字元,在正則表示式中也有一些固定的字元,他們可以表達某一型別的字元,以實現強大的匹配能力。
下面例舉一些常用的元字元:(注意大小寫之分)
\d 匹配一個數字字元
\D 匹配一個非數字字元
\w 匹配包括下劃線的任何單詞字元。[A-Za-z0-9_]
\W 匹配任何非單詞字元
\s 匹配任何空白字元,包括空格、製表符、換頁符等等
\S 匹配任何非空白字元
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置
\B 匹配非單詞邊界
\n 匹配一個換行符
\r 匹配一個回車符
\t 匹配一個製表符
. 匹配除"\n"之外的任何單個字元。
我們透過具體的例子來體會下這些元字元的作用。
案例1:提取字串
上圖中A列資料把產品和單價寫在一起了,有的是單價在產品前面,有的是單價在產品的後面,現在想把他們分開到兩列。
用函式也可以做 但挺麻煩的。如果用正則表示式,只要把每個單元格中的數字匹配出來,然後替換成空就得到了漢字部分了,反之只要把漢字匹配出來替換為空就得到了數字。
前面我們講過,在元字元中,\d 匹配一個數字字元,我們看下關鍵程式碼:
Sub 提取漢字()
Dim regx As Object, n%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "\d" '匹配數字
End With
Do
n = n + 1
Cells(n + 1, 2).Value = regx.Replace(Cells(n + 1, 1).Value, "")
Loop Until Cells(n + 1, 1).Value = ""
End Sub
同理,\D 匹配一個非數字字元,我們可以透過“\D”來匹配漢字,把漢字替換成空,得到數字。程式碼如下:
Sub 提取數字()
Dim regx As Object, n%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "\D"
End With
Do
n = n + 1
Cells(n + 1, 3).Value = regx.Replace(Cells(n + 1, 1).Value, "")
Loop Until Cells(n + 1, 1).Value = ""
End Sub
兩段程式碼的執行結果如下:
如果是字母和漢字放在一個單元格里,我們可以用\W 匹配任何非單詞字元,這樣就能匹配出字母,替換為空即可得到漢字部分。
案例2:規範格式
\s 匹配任何空白字元,包括空格、製表符、換頁符等等,我們把換行符和空格匹配出來並且全部替換為“-”即可。
程式碼如下:
Sub 規範格式()
Dim regx As Object, n%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "\s"
End With
Do
n = n + 1
Cells(n + 1, 2).Value = regx.Replace(Cells(n + 1, 1).Value, "-")
Loop Until Cells(n + 1, 1).Value = ""
End Sub
透過這節課,我們瞭解了什麼是元字元,並且初步體會到了正則表示式的強大之處,後面我們逐步地講解更加複雜的匹配。
轉自:米宏Office