上一節中我們講過了正則表達式的基礎語法,舉了一個例子,把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
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!