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

[技术讨论] VBS 正则匹配失败竟会导致脚本暂停

[复制链接]
发表于 2015-4-13 17:14:16 | 显示全部楼层 |阅读模式
  1. data = ReadTextFile("match_stop.txt")

  2. set ms = RegExMatch(data, "class=""smallphoto"" id=""(.*?)"".*?src=""(.*?)""[\s\S]*?author=""(.*?)""[\s\S]*?photoCName"">[\s\S]*?"">(.*?)<[\s\S]*?photoLName"">[\s\S]*?href=""(.*?)""[\s\S]*?class=""LatinName"">(.*?)<")
  3. MsgBox ms.count

  4. ' 去掉末尾的【""LatinName"">(.*?)<】则正常
  5. ' set ms = RegExMatch(data, "class=""smallphoto"" id=""(.*?)"".*?src=""(.*?)""[\s\S]*?author=""(.*?)""[\s\S]*?photoCName"">[\s\S]*?"">(.*?)<[\s\S]*?photoLName"">[\s\S]*?href=""(.*?)""[\s\S]*?class=")

  6. Function RegExMatch(ByRef inputstr, Pattern)
  7.         Set re = New RegExp
  8.         re.Pattern = Pattern
  9.         re.IgnoreCase = True
  10.         re.Global = True
  11.         MsgBox "呵呵呵,脚本要停止运行了..下面的 MsgBox 你看不见了."
  12.        
  13.         Set RegExMatch = re.Execute( inputstr )
  14.         MsgBox "你看不见我,你看不见我"
  15. End Function

  16. Function ReadTextFile(fPath)
  17.         Set filesys = CreateObject("Scripting.FileSystemObject")
  18.         Set filetxt = filesys.OpenTextFile(fPath, 1)
  19.         ReadTextFile = filetxt.ReadAll
  20. End Function
复制代码
发表于 2015-4-13 17:59:57 | 显示全部楼层
测试下面这段好像正常的哟
  1. data = "fasdfasdf"&vbCrLf&"_ffsafdwsaf"

  2. set ms = RegExMatch(data, "asdfasdf@<")
  3. MsgBox ms.count

  4. Function RegExMatch(ByRef inputstr, Pattern)
  5.         Set re = New RegExp
  6.         re.Pattern = Pattern
  7.         re.IgnoreCase = True
  8.         re.Global = True
  9.         MsgBox "呵呵呵,脚本要停止运行了..下面的 MsgBox 你看不见了."
  10.        
  11.         Set RegExMatch = re.Execute( inputstr )
  12.         MsgBox "你看不见我,你看不见我"
  13. End Function
复制代码
 楼主| 发表于 2015-4-13 19:28:33 | 显示全部楼层
是的,并不是所有情况都会导致脚本暂停。可是我顶楼给出的例子就是会导致脚本暂停。
发表于 2015-4-15 18:10:29 | 显示全部楼层
这不是 VBS 的问题。
目测表达式太长、或其他未知的表达式错误。
 楼主| 发表于 2015-4-16 01:36:45 | 显示全部楼层
本帖最后由 tmplinshi 于 2015-4-16 01:41 编辑

回复 4# yu2n
并不是目标表达式太长,如果我把表达式换成下面这行则运行正常、匹配成功(以下表达式比原来的还长):
set ms = RegExMatch(data, "class=""smallphoto"" id=""(.*?)"".*?src=""(.*?)""[\s\S]*?author=""(.*?)""[\s\S]*?photoCName"">[\s\S]*?"">(.*?)<[\s\S]*?photoLName"">[\s\S]*?href=""(.*?)""[\s\S]*?class=""plantname"".*?>(.*?)<")


脚本暂停,仅仅是表达式的末尾部分“LatinName"">(.*?)<”在源文件中找不到。既然找不到,正常情况 VBS 应该处理为匹配失败,而不是把脚本暂停了。

代码语法也并没有错误。既然代码语法没有错误,那么正则匹配无非两种结果——成功或者失败,“表达式错误”那就应该处理为匹配失败。

所以这当然是 VBS 的问题。
 楼主| 发表于 2015-4-16 01:57:33 | 显示全部楼层
本帖最后由 tmplinshi 于 2015-4-16 02:50 编辑

知道原因了,是因为达到了匹配的最大(长度?)限制,导致 VBS 卡住了。我用那个表达式在 AutoHotkey 中进行匹配也返回了 -8 的 ErrorLevel 值("reached match limit" (-8))。

试了下添加“On error resume Next”并没有效果,有方法忽略这个错误吗?

=====================================

匹配过程估计是这样:
由于数据中有比较多的 [\s\S]*?class="",但是数据中并没有 [\s\S]*?class=""LatinName,所以电脑不停地往前搜索 [\s\S]*?class="",结果到达了匹配的最大长度限制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 03:51 , Processed in 0.018632 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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