作者MOONRAKER (㊣糜不有初,鮮克有終)
看板Visual_Basic
標題Re: [VB6 ] 問一個有點笨的問題
時間Sat Mar 7 00:09:57 2009
: 推 JacobTai:漂亮...
: → MOONRAKER:那麼複雜的函數呼叫26次 我不認為這哪裡漂亮
: → MOONRAKER:只是表面上比較好維護而已
: → MOONRAKER:當然最好的辦法是用scripting.regex
: → Y78:不想呼叫那麼多次函數的話
: → Y78:不知道用陣列的方式會不會比較好?
: → Y78:Dim str()
: → Y78:str = array("A","B"...."Z")
: → Y78:for i = 0 to 25
: → Y78:str2 = replace(str2,str(i),"#")
: → Y78:next
for i=0 to 25,還不是要呼叫26次
複雜的是replace(),不是asc()
以長度 k 的字串來說,
用replace取代其中一個字元,每一個字元都要看過,複雜度 Θ(k)
跑26次,複雜度 Θ(26k)
本人的第一個寫法(見第一篇回應),這是一個老屁股寫法
只要從頭到尾看字串一次,複雜度 Θ(k),而且一次replace都用不到
至於本人以上說的regex (regexp, regular expression, 正規表示式,
正則表示式, whatever)
這也是一種老屁股寫法,但是歷久彌新,也不是大家都會,但是會了會比較爽
微軟本來還自己搞爛爛的簡易regex,後來不得不加上完整的regex支援,就是明證
為免口說無憑,以下特示範一次
註:這是VBA的,執行前要到功能表/工具/設定引用項目把
Microsoft VBScript regular expressions 5.5 勾起來
VBScript(用於舊的ASP)我也用過沒問題,怎麼引用忘了,程式不在手上
VB6我沒真的寫過,目前不能裝,但是應該不脫VBA的方法
Sub abc()
s0 = "Hello! Today is 6th of March, 2009."
s1 = "It was saw sLOwly slewing in snow"
Set regex0 = New regexp
Set regex1 = New regexp
regex0.Pattern = "[A-Za-z]" 'regex內容: 所有大寫字母和所有小寫字母
regex0.Global = True 'global選項: 找出全部符合字串
'(不設就只會取代第一個符合字串, 你可以去掉這行試試看)
regex1.Pattern = "s(\w+)w" '任何以 s 開頭,w 結尾,任意長度的字串
regex1.Global = True
MsgBox "before: " & vbCrLf & s0 & vbCrLf & s1
s0 = regex0.Replace(s0, "#")
s1 = regex1.Replace(s1, "***")
MsgBox "after: " & vbCrLf & s0 & vbCrLf & s1
End Sub
--
BATCH 03 : 買張床 - 切達大俠 - 伐木人之歌 -
http://tinyurl.com/3zpyx5
[B4準備中]: 謳歌金錢(7/02) - 單車超人(7/23) -
http://tinyurl.com/66v6vq
[ 番外篇 ]: 包租婆也有過當羅莉的時候(7/17) -
http://tinyurl.com/6j4ale
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
■ 蒙帝派松正體中文計畫 ■ Spam-a-lot and enjoy the pythonesque delight!
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ http://www.youtube.com/user/JamesBondXD▄▄
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.192.152
※ 編輯: MOONRAKER 來自: 59.112.192.152 (03/07 00:12)
推 Y78:阿 原來是replace的問題 orz 03/07 12:56
推 Y78:你的方法的確快很多很多 03/07 13:05
→ MOONRAKER:可是前一個方法是錯的 X( 不過我還是推薦大家學regex :) 03/07 13:35
推 yellissckk:恩 謝謝你囉 03/07 16:29