例項需求:只提取字串中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
8899
和66
?889966
怎麼被五馬分屍了,正則不靠譜呀!
其實這個6位數字被分為兩次匹配成功,\d
匹配8899
,\d
匹配66
。
看來需要修改正規表示式,既然提取指定位數的數字,那麼潛台詞就是說提取的數字組之前和之後都不是數字,幸好記得\d
可以匹配非數字,修改一句**如下。
objre.pattern = "\d+(\d)\d+"
再次測試**,結果如下:
為嘛結果只有乙個數字了,6688
和689
怎麼不見了。\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...