[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] vbs include 问题

本帖最后由 caspar 于 2012-11-22 17:32 编辑

本来vbs是不能像C那样 include 但是通过ExecuteGlobal 就能实现调用自定义类和函数

但是一些奇怪的问题就来了...

因为要多次调用正则来获取文字, 自身懒, 想写少点代码, 就写了一个RegExp的Function 那以后要再用到的时候 直接include
RegExp的代码:
  1. Public Function GetMatches(ByVal patrn, ByVal strng, ByRef MatchesCount, ByRef SubMatchesCount, ByVal regExIgnoreCase, ByVal regExGlobal)
  2.     Dim regEx, Match, Matches            ' 建立变量。
  3.     Dim arrMatch()
  4.     Set regEx = New RegExp               ' 建立正则表达式。
  5.     regEx.Pattern = patrn                ' 设置模式。
  6.     IF regExIgnoreCase="" Then           ' 设置不区分字符大小写。
  7.        regEx.IgnoreCase = True   
  8.     ELSE
  9.        regEx.IgnoreCase = regExIgnoreCase
  10.     End IF                          
  11.     IF regExGlobal="" Then
  12.        regEx.Global = True
  13.     ELSE
  14.        regEx.Global = regExGlobal
  15.     End IF                               ' 设置全局可用性。
  16.    
  17.     Set Matches = regEx.Execute(strng)   ' 执行搜索。
  18.    
  19.     MatchesCount=Matches.Count           ' 获取匹配数量
  20.     SubMatchesCount=Matches(0).SubMatches.Count
  21.     ReDim arrMatch(MatchesCount)
  22.     ReDim arrMatch(Matches.count,SubMatchesCount)
  23.     n=1     
  24.     For Each Match in Matches           ' 遍历匹配集合。
  25.         arrMatch(n,0)=Match.Value
  26.         For t=1 to Match.SubMatches.Count
  27.             arrMatch(n,t)=Match.submatches(t-1)
  28.         next
  29.         n=n+1
  30.      Next
  31.      
  32.      Set regEx = Nothing
  33.      GetMatches = arrMatch             ' 返回匹配矩阵
  34. End Function
复制代码
但问题来了...include之后 调用这个函数...
例如
  1. Dim arrMatches()
  2. arrMatches=GetMatches(patrn,str,mcount,smcount,true,true)
复制代码
就会提示类型不匹配...有高手知道这是为什么么...?

高手告诉你,问题在于,你的学问太渊博了。。。。
不需要管变量类型,把太细节的东西扔掉就好了,你要写成
  1. Dim arrMatches
  2. arrMatches=GetMatches(patrn,str,mcount,smcount,true,true)
复制代码

TOP

返回一个数组啊,不行吧

数组赋值不是这样赋的吧

我是新手啊,大概这么猜下,不确定

要不用join函数连接成一个字符串,返回后再处理?

QQ 20147578

TOP

高手教教我怎么include吧

TOP

回复 2# zz100001


  不用ByRef的话 那要获取匹配数 只能通过全局变量了吧....- -!

TOP

回复 3# czjt1234


    那样就更烦了...因为Matches的不确定性...后期处理字符串的时候太多种可能了....如果这样 不如直接每次New RegExp...

TOP

本帖最后由 caspar 于 2012-11-22 18:48 编辑
返回一个数组啊,不行吧

数组赋值不是这样赋的吧

我是新手啊,大概这么猜下,不确定

要不用join函 ...
czjt1234 发表于 2012-11-22 18:07



    函数返回值可以有几种方式的...可以返回一个集合 数组 字串 或者通过定义ByRef在调用函数时候把变量指针传递给函数 在函数内处理时候 直接改变父程序的变量内容
   又或者用一个更不好的方式...就是全局变量...但是这个比较蛋疼...尽量避免...

   但是因为vb的语法不严谨...所以很多时候类型会很模糊...

TOP

高手教教我怎么include吧
Demon 发表于 2012-11-22 18:10


把这个代码黏贴到程序里头 然后就能像C那样 include "程序"
可以自定义类 子程序 函数等....
  1. Sub Include(sInstFile)
  2.     On Error Resume Next
  3.     Dim oFSO, f, s
  4.     Set oFSO = CreateObject("Scripting.FileSystemObject")
  5.     If oFSO.FileExists(sInstFile) Then
  6.         Set f = oFSO.OpenTextFile(sInstFile)
  7.         s = f.ReadAll
  8.         f.Close
  9.         ExecuteGlobal s
  10.     End If
  11.     Set oFSO = Nothing
  12.     Set f = Nothing
  13. End Sub
复制代码

TOP

通过子程序 ByRef 数组解决了....

TOP

不明白,子函数Sub本来就可以调用的啊

跟 include ExecuteGlobal 有什么关系?

QQ 20147578

TOP

回复 8# caspar


    好办法…
目测 match 好像不能又 dim 又用在 for each 中

TOP

不明白,子函数Sub本来就可以调用的啊

跟 include ExecuteGlobal 有什么关系?
czjt1234 发表于 2012-11-23 08:21



    很是神奇.... 现在改成
  1. Public Sub GetMatches(ByRef arrMatch(), ByRef patrn, ByVal strng, ByRef MatchesCount, ByRef SubMatchesCount, ByVal regExIgnoreCase, ByVal regExGlobal)
复制代码
传递数组指针过去 就能返回了....

TOP

回复  caspar


    好办法…
目测 match 好像不能又 dim 又用在 for each 中
CrLf 发表于 2012-11-23 09:39



    咕~~(╯﹏╰)b.....改改.....

TOP

把这个代码黏贴到程序里头 然后就能像C那样 include "程序"
可以自定义类 子程序 函数等....
caspar 发表于 2012-11-22 18:46



    学习了。

TOP

返回列表