Board logo

标题: [问题求助] 求助,vbs用正则表达式匹配提取IP地址出现错误。 [打印本页]

作者: Cameron    时间: 2012-9-25 19:05     标题: 求助,vbs用正则表达式匹配提取IP地址出现错误。

本帖最后由 Cameron 于 2012-9-25 19:34 编辑

脚本代码如下:
  1. dim fso,otf,regEx,Matches  ' 建立变量。
  2. set fso=createobject("scripting.filesystemobject")
  3. set otf=fso.OpenTextFile(WScript.Arguments(0),1,False)   ' 打开拖动到脚本上的文件。
  4. 'Set regEx = New RegExp   ' 建立正则表达式对象。
  5. Set regex = CreateObject("VBScript.RegExp")   ' 建立正则表达式对象。
  6. regEx.Pattern = "([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])"   ' 设置匹配IP地址的模式。
  7. regEx.IgnoreCase = True   ' 设置是否区分大小写。
  8. regEx.Global = True   ' 设置全程可用性。
  9. Set Matches = regEx.Execute(otf.readall)   ' 执行搜索。
  10. set fso=createobject("scripting.filesystemobject")
  11. set wrtxtfl=fso.openTextFile(CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.Arguments(0))&"\IPlist"&FormatDateTime(date,1)&join(split(time,":",-1),":")&".txt",8,true)   ' 创建并以写模式打开目标文件同目录下的以“IPlist当前日期时间.txt”为文件名的文件。
  12. for each match in matches   ' 逐个元素读取通过正则匹配提取IP地址得到的数组。
  13.    wrtxtfl.writeline match   ' 将数组元素逐行写入文件。
  14. next
复制代码
目标文件如下:
  1. 非权威应答:
  2. 服务器:  UnKnown
  3. Address:  [color=Red]222.222.222.222[/color]
  4. 名称:    www.a.shifen.com
  5. Addresses:  119.75.217.56
  6.   119.75.218.77
  7. Aliases:  www.baidu.com
  8. 非权威应答:
  9. 服务器:  UnKnown
  10. Address:  222.222.222.222
  11. 名称:    static.n.shifen.com
  12. Addresses:  180.149.132.72
  13.   220.181.163.18
  14. Aliases:  eiv.baidu.com
  15. 非权威应答:
  16. 服务器:  UnKnown
  17. Address:  222.222.222.222
  18. 名称:    hm.e.shifen.com
  19. Address:  220.181.112.34
  20. Aliases:  hm.baidu.com
  21. 非权威应答:
  22. 服务器:  UnKnown
  23. Address:  222.222.222.222
  24. 名称:    www.qq.com
  25. Addresses:  2402:4e00::b
  26.   2402:4e00::11
  27.   2402:4e00::a
  28.   220.181.138.59
  29. 非权威应答:
  30. 服务器:  UnKnown
  31. Address:  222.222.222.222
  32. 名称:    www.tencent.com
  33. Address:  121.14.98.70
  34. 非权威应答:
  35. 服务器:  UnKnown
  36. Address:  222.222.222.222
  37. 名称:    163.xdwscache.glb0.lxdns.com
  38. Address:  183.60.136.64
  39. Aliases:  www.163.com
  40.   www.cache.wangsu.netease.com
  41.   www.163.com.lxdns.com
  42.   www.163.z.lxdns.com
  43. 非权威应答:
  44. 服务器:  UnKnown
  45. Address:  222.222.222.222
  46. 名称:    almack.sina.com.cn
  47. Address:  [color=Red]218.30.108.232[/color]
  48. Aliases:  www.sina.com
  49.   us.sina.com.cn
  50.   news.sina.com.cn
  51.   jupiter.sina.com.cn
  52. 非权威应答:
  53. 服务器:  UnKnown
  54. Address:  222.222.222.222
  55. 名称:    fzw.a.sohu.com
  56. Addresses:  220.181.26.7
  57.   220.181.118.87
  58. Aliases:  www.sohu.com
  59.   gs.a.sohu.com
复制代码
运行结果如下:
  1. [color=Red]222.222.222.22[/color]
  2. 119.75.217.56
  3. 119.75.218.77
  4. 222.222.222.22
  5. 180.149.132.72
  6. 220.181.163.18
  7. 222.222.222.22
  8. 220.181.112.34
  9. 222.222.222.22
  10. 220.181.138.59
  11. 222.222.222.22
  12. 121.14.98.70
  13. 222.222.222.22
  14. 183.60.136.64
  15. 222.222.222.22
  16. [color=Red]218.30.108.23[/color]
  17. 222.222.222.22
  18. 220.181.26.7
  19. 220.181.118.87
复制代码
上面目标文件及运行结果中的颜色标记是为方便大家查看错误后来加上的,原本没有。
目标文件中IP地址的最后一组数字有些原本是三位(比如222.222.222.222),在处理结果中都变成了两位(比如222.222.222.22),是哪里出错了?请各位指正!
作者: CrLf    时间: 2012-9-25 20:01

限定一个单词边界就行了,用 \W 或 \b 都行
  1. Set fso = CreateObject("scripting.filesystemobject")
  2. text = fso.OpenTextFile("a.txt",1).ReadAll
  3. Set re = New RegExp
  4. re.Global = True
  5. re.IgnoreCase = True
  6. re.MultiLine = True
  7. key = "(?:1?\d?\d|2[0-4]\d|25[0-5])"
  8. re.Pattern = "\b" & key & "\." & key & "\." & key & "\." & key & "\b"
  9. set ex = re.Execute(text)
  10. For Each e In ex
  11.     str = str & e & vbCrLf
  12. Next
  13. WScript.Echo str
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2