找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23707|回复: 8

[技术讨论] 【出题】vbs去除重复的字符串

[复制链接]
发表于 2011-5-24 01:31:42 | 显示全部楼层 |阅读模式
已知字符串“bat home home Net home net Bat net”

要求用vbs去除所有重复的字符串(忽略大小写)

输出为“bat home net”
发表于 2011-5-24 11:03:23 | 显示全部楼层
路过,花时间写了个来支持。

  1. Dim s        '源字符串
  2. Dim final        '最终字符串
  3. Dim ss,i,j

  4. s="bat home home Net home net Bat net"
  5. 'For i=0 To 10
  6. '        s=s & " " & s
  7. 'Next
  8. ss=Split(s," ")
  9. MsgBox "Length: " & Len(s) & vbNewLine & "Count: " & UBound(ss)+1
  10. ReDim mark(UBound(ss))
  11. For i=0 To UBound(ss)-1
  12.         If (mark(i)=0) Then
  13.                 For j=i+1 To UBound(ss)
  14.                         If (mark(j)=0) Then
  15.                                 If (StrComp(ss(i),ss(j),vbTextCompare)=0) Then
  16.                                         mark(i)=1:mark(j)=-1
  17.                                 End If
  18.                         End If
  19.                 Next
  20.         End if
  21. Next
  22. For i=0 To UBound(ss)
  23.         If (mark(i)=1) Then final=final & ss(i) & " "
  24. Next
  25. If (Len(final)>0) Then final=Left(final,Len(final)-1)
  26. Erase mark

  27. MsgBox final
复制代码
发表于 2011-5-24 11:34:22 | 显示全部楼层
再贴一个利用Dictionary对象Key唯一性的方法。
这个和楼上的代码,大部分时间都花在Split上了;不过目前也没有好的解决办法。

  1. Sub Cut2
  2.         Dim s        '源字符串
  3.         Dim final        '最终字符串
  4.         Dim ss,i
  5.         Dim dic        '字典对象
  6.         Set dic=CreateObject("Scripting.Dictionary")
  7.        
  8.         s="bat home home Net home net Bat net"
  9. '        For i=0 To 10
  10. '                s=s & " " & s
  11. '        Next
  12.         ss=Split(s," ")
  13.         MsgBox "Length: " & Len(s) & vbNewLine & "Count: " & UBound(ss)+1
  14.         For i=0 To UBound(ss)
  15.                 If (dic.Exists(LCase(ss(i)))=False) Then dic.Add LCase(ss(i)),ss(i)
  16.         Next
  17.         Erase ss
  18.        
  19.         For Each item In dic.Items
  20.                 final=final & item & " "
  21.         Next
  22.         Set dic=Nothing
  23.        
  24.         If (Len(final)>0) Then final=Left(final,Len(final)-1)
  25.                
  26.         MsgBox final
  27. End Sub
复制代码

评分

参与人数 1PB +10 收起 理由
batman + 10 不错

查看全部评分

 楼主| 发表于 2011-5-24 17:37:14 | 显示全部楼层
用split+instr就可以解决问题了,当然用key更加规范。。。
 楼主| 发表于 2011-5-25 18:32:37 | 显示全部楼层
vbs就这样没人气。。。
my answer

  1. vbstr = "bat home home Net home net Bat net"
  2. For Each str In Split(vbstr, Chr(32))
  3.   If InStr(LCase(vbout), LCase(str)) = 0 Then vbout = vbout & str & Chr(32)
  4. Next
  5. MsgBox LCase(vbout)
复制代码

评分

参与人数 1技术 +1 收起 理由
wankoilz + 1 赞一个

查看全部评分

 楼主| 发表于 2011-5-25 19:49:22 | 显示全部楼层
给上一段和楼上思路一样的批代码帮助大家理解(没有将大写转为小写):

  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=bat home home Net home net Bat net"
  3. set "var=@"
  4. for %%a in (%str%) do if /i "!var:%%a=!" equ "!var!" set "var=!var! %%a"
  5. echo !var:~2!
  6. pause>nul
复制代码
发表于 2011-5-26 13:06:41 | 显示全部楼层
5楼的方法真是好,以前写过去重复字符的vbs,但是比起5楼得方法显得太笨拙了,赞一个!
发表于 2011-5-26 19:38:57 | 显示全部楼层
5# batman


这不是bat的思路么...
 楼主| 发表于 2011-5-26 20:10:14 | 显示全部楼层
8# zm900612
看6楼。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:43 , Processed in 0.027386 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表