Board logo

標題: [發問] 文字數值拆分 [打印本頁]

作者: ayubbs    時間: 2015-3-11 12:10     標題: 文字數值拆分

Dear 各位先進大大 :

有一文字數值剖析的問題,向大家求教

一文字 英數混雜    比如 AAA120CCC4DC   想從左起去除英文字取 120 數值
文字串沒有固定長度前後都有可能有英文數字,VBA中可有方式可取得其值,
或是可有涵數方式也可達成
謝謝指導
作者: stillfish00    時間: 2015-3-11 14:18

回復 1# ayubbs
  1. Sub Test()
  2.     Dim oReg As Object, s As String, sGet As String
  3.     s = "AAA120CCC4DC"  '120
  4.     's = "120CCC4DC"    '120
  5.     's = "AAA120"       '120
  6.    
  7.     Set oReg = CreateObject("vbscript.regexp")
  8.     With oReg
  9.         .Pattern = "^[^\d]*(\d+).*$"
  10.         If .Test(s) Then
  11.             sGet = .Replace(s, "$1")
  12.             MsgBox "取出文字為: " & sGet
  13.         Else
  14.             MsgBox "字串不符合指定格式"
  15.         End If
  16.     End With
  17. End Sub
複製代碼

作者: ayubbs    時間: 2015-3-13 13:02

回復 2# stillfish00


    謝謝大大指導~小妹笨拙實在不了解這個應用是怎麼達成的

.Pattern = "^[^\d]*(\d+).*$"        
sGet = .Replace(s, "$1")

如果 字串內容 為   中英文字混符號及  到   如為    "取字串125acd"   可取得125的值  
但若為"取字串12.5acd" 可否取得含小數部份  如12.5  字串字樣

謝謝~增加知識
作者: stillfish00    時間: 2015-3-13 13:40

本帖最後由 stillfish00 於 2015-3-13 13:48 編輯

回復 3# ayubbs
是的,要看你所謂的數字包含哪些格式
前面例子抓的是只有 0~9的連續數字
因為你說明的敘述只包含這種數字
如果要含小數點

.Pattern = "^[^\d]*(\d+(\.\d+)?).*$"   

就可以了
作者: stillfish00    時間: 2015-3-13 14:29

本帖最後由 stillfish00 於 2015-3-13 14:51 編輯

回復 4# stillfish00
.Pattern = "^[^\d]*(\d+(\.\d+)?).*$"

簡單解釋一下,正則表示法(正規表達式)是用pattern設置規則
來判斷文字中是否能找到一段是符合規則的字串
開頭的^表示匹配文字開頭
結尾的$表示匹配文字結尾
所以是檢查文字是否完全符合
其中 \d 表示 0或1或2或....或9 的字元
[^\d] 表示非 0或1或2或....或9 的字元
. 表示任意字元
\.  才是表示小數點
* 表示前一個字元重複0次~重複無限多次
+ 表示前一個字元重複1次~重複無限多次
? 表示前一個字元重複0次 或 重複1次
( ) 括號有兩種意義,  
一是為了儲存括號匹配的文字到內部的子字串 , 也就是後來可用"$1"提取出來
一是當( )後面皆上像* + ? 時 重複的不是一個字元而是括號內的字

因此   "^[^\d]*(\d+(\.\d+)?).*$"   解釋意思就是
^  開頭是
[^\d]*  零個或N個非數字文字
\d+   1個以上連續數字
(\.\d+)?   小數點接1個以上連續數字 , 或沒有
.*   任意多個字元 , 或沒有
$  結尾

大致是這樣.........
當然這邊只是一例而已,pattern可以有很多種用法
詳細語法要自己去找正則表示法來看

另一種寫法:
  1. Sub TestGGG()
  2.     Dim oReg As Object, s As String, oMatch As Object, sGet As String
  3.     s = "取字串12.3acd"  '12.3
  4.     's = "120CCC4DC"    '120
  5.     's = "AAA120"       '120
  6.    
  7.     Set oReg = CreateObject("vbscript.regexp")
  8.     oReg.Pattern = "\d+(\.\d+)?"
  9.     Set oMatch = oReg.Execute(s)
  10.    
  11.     If oMatch.Count > 0 Then
  12.         sGet = oMatch(0)
  13.         MsgBox "取出數字為: " & sGet
  14.     Else
  15.         MsgBox "找不到數字"
  16.     End If
  17. End Sub
複製代碼

作者: ayubbs    時間: 2015-3-17 12:43

回復 5# stillfish00

謝謝大大說明的超詳細的
會好好學習測試,內容看來不簡單要把邏輯給它弄清楚才能活用。

謝謝~又多學到了些知識
作者: ABK    時間: 2017-6-26 22:56

請教stillfish00大 !  
您提供的方法是不是只能用在 英文字母與數字混和的字串, 若是數字與中文字混合的字串是否有對應Pattern可以使用?




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)