作者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!
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ https://www.youtube.com/user/JamesBondXD▄▄
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.112.192.152
※ 编辑: MOONRAKER 来自: 59.112.192.152 (03/07 00:12)
1F:推 Y78:阿 原来是replace的问题 orz 03/07 12:56
2F:推 Y78:你的方法的确快很多很多 03/07 13:05
3F:→ MOONRAKER:可是前一个方法是错的 X( 不过我还是推荐大家学regex :) 03/07 13:35
4F:推 yellissckk:恩 谢谢你罗 03/07 16:29