VBA之正規表示式(14) 提取指定位數的數字

2021-09-24 05:20:40 字數 2151 閱讀 3996

例項需求:只提取字串中2位~4位的數字(無小數點),提取結果為藍色數字。

測試字串:6688-部門員工共10人與2023年6月成功完成銷售額889966訂單數689

這次的話題有些太簡單了吧!?任何學習正則的同學基本上首先學會的就是這個知識點,一起回顧一下。

匹配數字有兩種表示方法:

2位~4位指的是數字字元的重複次數,可以用\d\d|\d\d\d|\d\d\d\d,重複次數比較少,組合也不多,這樣還可以,其實應該用大括號\d,注意不是

正規表示式已經有了,如果我說這次講解到結束,接下來是掌聲還是雞蛋呢 … …

用**測試一下效果吧。

sub getdigits()

dim strtxt as string

dim objre as object

dim objmh as object

strtxt = "6688-部門員工共10人與2023年6月成功完成銷售額889966訂單數689"

set objre = createobject("vbscript.regexp")

objre.global = true

objre.pattern = "(\d)"

for each objmh in objre.execute(strtxt)

debug.print objmh.submatches(0)

next

end sub

結果如下:

6688

102019

8899

66689

輸出結果中為什麼有889966889966怎麼被五馬分屍了,正則不靠譜呀!

其實這個6位數字被分為兩次匹配成功,\d匹配8899\d匹配66

看來需要修改正規表示式,既然提取指定位數的數字,那麼潛台詞就是說提取的數字組之前和之後都不是數字,幸好記得\d可以匹配非數字,修改一句**如下。

objre.pattern = "\d+(\d)\d+"
再次測試**,結果如下:

為嘛結果只有乙個數字了,6688689怎麼不見了。\d可以匹配非數字是正確的,但是不能用於匹配字串的開始位置和結尾位置,所以頭和尾的數字不符合匹配模式,只能再修改匹配模式了。

最終的示例**如下。

sub getdigits()

dim strtxt as string

dim objre as object

dim objmh as object

strtxt = "6688-部門員工共10人與2023年6月成功完成銷售額889966訂單數689"

set objre = createobject("vbscript.regexp")

objre.global = true

objre.pattern = "(?:^|\d)(\d)(?=\d|$)"

for each objmh in objre.execute(strtxt)

debug.print objmh.submatches(0)

next

end sub

結果如下:

6688

102019

689

終於得到了正確結果,貌似乙個簡單的小問題,實際上用到的知識點還真不少。

vba之正規表示式(13)-- 字串變換

vba之正規表示式(14)-- 提取指定位數的數字

vba之正規表示式(15)-- 提取數字求和

vba之正規表示式(16)-- 提取非重複值

vba之正規表示式(17)-- 提取多組資料(去除末尾字元)

VBA 正規表示式

正規表示式的概述 正規表示式原本是形式語言理論中的概念,與編譯器的構造有密切的聯絡。但是作為乙個應用軟體的使用者,我們沒有必要去細究正規表示式的嚴格定義和處理方法。本文將從實用的角度出發,闡述引入正規表示式的目的 正規表示式的命令格式,以及如何利用正規表示式完成一些實際的文字處理工作。我們在處理文字...

VBA 正規表示式

1.寫好正規表示式,在資料擷取處理中是十分有優勢的,以下舉幾個例子來學習一下正規表示式的用法 option explicit public function getnum2 str as string with createobject vbscript.regexp global false 全域...

VBA之正規表示式(4) 提取日期和金額

例項需求 資料儲存在a列中,需要將其中的日期和金額分別提取至b列和c列。其中日期也兩種不同格式,金額可能包含小數點 千分符和貨幣標識。objregex.pattern d d d d d d a z d d.元 objregex.global true for i 2 to cells rows.c...