Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4499|回复: 15

[已解决]解释正则表达式?

[复制链接]
发表于 2014-4-8 13:27 | 显示全部楼层 |阅读模式
本帖最后由 hahada 于 2014-4-8 15:34 编辑

Dim sz(), sz1, SZ2(), myRegExp As Object
    On Error Resume Next
    Set myRegExp = CreateObject("VBScript.RegExp")
    myRegExp.Global = True
    myRegExp.IgnoreCase = Ture
    myRegExp.Pattern = "\d{4}-\d{1,2}-\d{1,2}-\d{1,2}.xls"
    S = Dir(ThisWorkbook.Path & "\*.xls")
    N = -1
   
    Do While S <> ""
        If UCase(S) Like "*#-*#-*#-[0-9][0-9]*.XLS" Then
            N = N + 1
            ReDim Preserve sz(N)
            sz(N) = S
              If UCase(S) Like "??[0-9]*" Then
                ReDim Preserve SZ2(N)
                SZ2(N) = Mid(S, 3, 1)  
            End If
        End If
        S = Dir
    Loop
    Set matchs = myRegExp.Execute(Join(sz, ","))
最佳答案
2014-4-8 15:16
hahada 发表于 2014-4-8 14:44
那下面再解释下

Dim sz(), sz1, SZ2(), myRegExp As Object      
    On Error Resume Next      '跳过错误继续执行程序
    Set myRegExp = CreateObject("VBScript.RegExp")  ’创建一个正则表达式对象
    myRegExp.Global = True      '设置正则搜索为全局搜索
    myRegExp.IgnoreCase = Ture     '设置正则搜索为忽略大小写
    myRegExp.Pattern = "\d{4}-\d{1,2}-\d{1,2}-\d{1,2}.xls"            ’正则的搜索匹配模型为:4个数字,一个 - 号,1到2个数字一个 -号,1到2个数字,一个 - 号,1到2个数字,一个.号,xls
    S = Dir(ThisWorkbook.Path & "\*.xls")       '把dir得到的代码文件 所在的文件夹下的 xls文件名赋值给S.
    N = -1          '给变量N赋值为-1

    Do While S <> ""                ’当满足S<>""这个条件时,执行DO循环。
        If UCase(S) Like "*#-*#-*#-[0-9][0-9]*.XLS" Then   '    如果 这个xls文件名忽略大小写后符合:任何字符加一个数字加一个 - 号,加任何字符加一个数字加一个 - 号,任何字符加一个数字加一个 - 号,加两个数字,后面用或者没有任意字符.xls 这样的样式就执行下面的代码。
            N = N + 1    '计数开始,第一个N值为:-1+1=0
            ReDim Preserve sz(N)        ’ 保留数组sz原有值的情况下,重新字义数据sz的最后一维的个数,以便写入下一个xls文件名
            sz(N) = S          '把符合上面条件的xls文件名装入数组的第N个位置。
              If UCase(S) Like "??[0-9]*" Then      '如果这个xls文件名忽略大小写后符合: 第三个字符为数字的文件。就执行下面的代码。
                ReDim Preserve SZ2(N)     '在保留数组SZ2的原有元素的基础上重新扩大数组的第二维的维数为N.
                SZ2(N) = Mid(S, 3, 1)      '取出文件名中的第三个字符(即第三个数字)存放在SZ2的第N个位置。
            End If               ’结束IF判断
        End If        ’结束IF判断
        S = Dir      '重新取得下一个XLS文件名赋值给S。以便于DO循环进行取值。
    Loop        ’  DO循环线束
    Set matchs = myRegExp.Execute(Join(sz, ","))     '把数组sz中的xls文件名用,号连接起来为一个字符串。通过正则表达式的搜索,把所有符合patten模型的字符串全都取出来赋值给变量:matchs

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-4-8 14:26 | 显示全部楼层
myRegExp.Pattern = "\d{4}-\d{1,2}-\d{1,2}-\d{1,2}.xls"
d代表数字,最少4位,---数字一位到两位,---数字一位到两位,---数字一位到两位,后缀名为XLS,即excel文件

评分

参与人数 1 +1 收起 理由
hahada + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-4-8 14:44 | 显示全部楼层
苗凱 发表于 2014-4-8 14:26
myRegExp.Pattern = "\d{4}-\d{1,2}-\d{1,2}-\d{1,2}.xls"
d代表数字,最少4位,---数字一位到两位,---数 ...

那下面再解释下

回复

使用道具 举报

发表于 2014-4-8 15:06 | 显示全部楼层
*#-*#-*#-[0-9][0-9]*
*代表0个或多个字符
#代码一位数字,0-9
后面的[0-9]其实可以用#代替。

评分

参与人数 1 +1 收起 理由
hahada + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-4-8 15:16 | 显示全部楼层    本楼为最佳答案   
hahada 发表于 2014-4-8 14:44
那下面再解释下

Dim sz(), sz1, SZ2(), myRegExp As Object      
    On Error Resume Next      '跳过错误继续执行程序
    Set myRegExp = CreateObject("VBScript.RegExp")  ’创建一个正则表达式对象
    myRegExp.Global = True      '设置正则搜索为全局搜索
    myRegExp.IgnoreCase = Ture     '设置正则搜索为忽略大小写
    myRegExp.Pattern = "\d{4}-\d{1,2}-\d{1,2}-\d{1,2}.xls"            ’正则的搜索匹配模型为:4个数字,一个 - 号,1到2个数字一个 -号,1到2个数字,一个 - 号,1到2个数字,一个.号,xls
    S = Dir(ThisWorkbook.Path & "\*.xls")       '把dir得到的代码文件 所在的文件夹下的 xls文件名赋值给S.
    N = -1          '给变量N赋值为-1

    Do While S <> ""                ’当满足S<>""这个条件时,执行DO循环。
        If UCase(S) Like "*#-*#-*#-[0-9][0-9]*.XLS" Then   '    如果 这个xls文件名忽略大小写后符合:任何字符加一个数字加一个 - 号,加任何字符加一个数字加一个 - 号,任何字符加一个数字加一个 - 号,加两个数字,后面用或者没有任意字符.xls 这样的样式就执行下面的代码。
            N = N + 1    '计数开始,第一个N值为:-1+1=0
            ReDim Preserve sz(N)        ’ 保留数组sz原有值的情况下,重新字义数据sz的最后一维的个数,以便写入下一个xls文件名
            sz(N) = S          '把符合上面条件的xls文件名装入数组的第N个位置。
              If UCase(S) Like "??[0-9]*" Then      '如果这个xls文件名忽略大小写后符合: 第三个字符为数字的文件。就执行下面的代码。
                ReDim Preserve SZ2(N)     '在保留数组SZ2的原有元素的基础上重新扩大数组的第二维的维数为N.
                SZ2(N) = Mid(S, 3, 1)      '取出文件名中的第三个字符(即第三个数字)存放在SZ2的第N个位置。
            End If               ’结束IF判断
        End If        ’结束IF判断
        S = Dir      '重新取得下一个XLS文件名赋值给S。以便于DO循环进行取值。
    Loop        ’  DO循环线束
    Set matchs = myRegExp.Execute(Join(sz, ","))     '把数组sz中的xls文件名用,号连接起来为一个字符串。通过正则表达式的搜索,把所有符合patten模型的字符串全都取出来赋值给变量:matchs

评分

参与人数 1 +1 收起 理由
hahada + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-4-8 15:22 | 显示全部楼层
810126769 发表于 2014-4-8 15:16
Dim sz(), sz1, SZ2(), myRegExp As Object      
    On Error Resume Next      '跳过错误继续执行程序 ...

回答这么详细,早知我发个完整的代码,等有时间发个全的,帮我解释解释
回复

使用道具 举报

 楼主| 发表于 2014-4-8 15:37 | 显示全部楼层
本帖最后由 hahada 于 2014-4-8 21:32 编辑
810126769 发表于 2014-4-8 15:16
Dim sz(), sz1, SZ2(), myRegExp As Object      
    On Error Resume Next      '跳过错误继续执行程序 ...


.Pattern = "\d+($|\n)" 这种是什么匹配模式?
回复

使用道具 举报

发表于 2014-4-8 15:57 | 显示全部楼层
hahada 发表于 2014-4-8 15:37
. Pattern = "\d+($|\n)" 这种是什么匹配模式?

  "\d+($|\n)"       匹配: 1个到任意多个数字加字符串的结尾  或者:1到任意多个数字加上换行符。
回复

使用道具 举报

发表于 2014-4-8 16:15 | 显示全部楼层
很详细,学习学习了!
回复

使用道具 举报

 楼主| 发表于 2014-4-8 19:59 | 显示全部楼层
810126769 发表于 2014-4-8 15:57
"\d+($|\n)"       匹配: 1个到任意多个数字加字符串的结尾  或者:1到任意多个数字加上换行符。

为什么加个换行符?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-25 06:51 , Processed in 1.872159 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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