首頁>職場>

上一節中我們講過了正則表示式的基礎語法,舉了一個例子,把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

6
最新評論
  • 工作沒回報,還要繼續嗎?
  • 怎麼用Excel做個圖片瀏覽器