精华内容
下载资源
问答
  • 正则表达式 – VBA正则表达式匹配时间范围,如“下午1:30 – 凌晨12:00”
    2021-04-20 15:32:48

    搜索热词

    我正在尝试使用VBA正则表达式来验证表单的时间范围:#0:00xm – #0:00xm其中x是a或p.所以字符串文字可能是“下午1:30 – 凌晨12:00”.我想匹配具有此模式的单元格.

    当我在这个在线工具中使用常规表达时:http://public.kvalley.com/regex/regex.asp并检查我的表达式,它匹配正确.

    但是,当我在VBA中使用相同的表达式时,它不匹配.

    Dim rRange As Range

    Dim rCell As Range

    Set rRange = Range("A2","A4") '"G225")

    For Each rCell In rRange.Cells

    MsgBox (rCell.Value)

    If rCell.Value Like "^([0-9]{1,2}[:][0-9]{2}[apm]{2}[ ][-][ ][0-9]{1,2}[:][0-9]{2}[apm]{2})$" Then

    MsgBox ("YES")

    'rCell.Interior.Color = RGB(0,250,0)

    Else

    MsgBox ("NO")

    'rCell.Interior.Color = RGB(250,0)

    End If

    Next rCell

    对于任何关心的人来说,这是我固定的工作版本,特别感谢dda更简单的RegEx ^^:

    Dim rRange As Range

    Dim rCell As Range

    Dim re As Object

    Set re = CreateObject("vbscript.regexp")

    With re

    .Pattern = "^\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM]$"

    .Global = False

    .IgnoreCase = False

    End With

    Set rRange = Range("A2","G225")

    For Each rCell In rRange.Cells

    If re.Test(rCell) Then

    rCell.Interior.Color = RGB(0,0)

    Else

    rCell.Interior.Color = RGB(250,0)

    End If

    Next rCell

    总结

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    更多相关内容
  • 支持win10,没有替换功能,可以替代vba进行的测试工具
  • vba正则表达式

    2018-11-28 17:24:46
    vba正则表达式学习文档,涵盖详细的正则语法说明、有具体的功能例子,可做文档查询或实例参考。
  • EXCEL VBA 正则表达式 从实例开始 所有代码都测试过 ' ' '[2011-09-09 '[2010-08-08 ' 数据验证经常出现的情况是需要验证和处理大量的文本 内容 有时候需要查找字符串 有时候要按条件替换 并且这些待处理的问题还是...
  • VBA正则世界 这是在VBA中编写的工具,支持正则表达式。 关于 这是对以下工具的支持: 在文件或文件夹列表中使用正则表达式搜索。 列出结果到每个单元格。 使用正则表达式进行替换,并输出替换信息数据表。 清理...
  • VBA 正则表达式

    2019-02-26 09:40:41
    文档涵盖了VBA中正则表达式的使用,以及一些实例案件,可以由浅入深的讲解VBA 中正则表达式的实现
  • 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 或许你也需要匹配双字节字符,中文也是双字节的字符 代码如下: 匹配双字节字符(包括汉字在内):[^\x00-\xff] 注:可以用来计算字符串的长度(一个双字节字符长度计2,...
  • vba正则表达式入门

    2021-06-10 12:38:17
    1、什么是正则表达式正则表达式是一个天才创建的用于快速检索匹配字符串,通过简单的表达式匹配文本。2、正则表达式的组成正则表达式也是一个字符串,包括元字符、限定符和正常意义的字符。正则表达式强大的地方就在...

    1、什么是正则表达式

    正则表达式是一个天才创建的用于快速检索匹配字符串,通过简单的表达式匹配文本。

    2、正则表达式的组成

    正则表达式也是一个字符串,包括元字符、限定符和正常意义的字符。正则表达式强大的地方就在元字符和限定符。

    3、限定符

    很多人讲这个都是先讲元字符。其实先讲限定符更加容易吸收。限定符是表示前面字符或元字符出现的次数。主要限定符如下:限定符含义

    *表示前面字符或元字符出现0次或多次。例如:zo*m,可以匹配zm,zom,zoom

    +表示前面字符或元字符出现1次或多次。例如:zo+m,可以匹配zom,zoom

    ?表示前面字符或元字符出现0次或1次。例如:zo?m,可以匹配zm,zom

    {n}表示前面字符或元字符出现n次。例如:zo{3}m,可以匹配zooom

    {n,m}表示前面字符或元字符出现n到m次。例如:zo{1,3}m,可以匹配zom,zoom,zooom

    {n,}表示前面字符或元字符至少出现n次。例如:zo{2,}m,可以匹配zoom,zooom等等

    当然,限定符用法不止这些。正则表达式还有个规则叫贪婪与吝啬。有些人也叫贪婪与懒惰。这个“贪婪与吝啬”是正则表达式难点和重点之一。

    例如,字符串“n123n456n789n”。那么我们怎么匹配获取“n123n”和“n123n456n789n”呢。

    使用正则表达式,首先要找规律。很明显我们要获取的内容开头和结尾都有一个字母n,中间是数字或字母。我们先学一个元字符。元字符是可以代表一定含义或规律的字符。可以匹配除了换行符之外的任意字符是小数点。

    那么我们的表达式可以这么写:n.+n

    两个字母n,中间夹着1个或多个任意字符。

    但这样只能匹配得到一个结果:n123n456n789n。在我们没有对其任何限制的情况下,正则表达式会尽可能多匹配符合条件的结果。从头到尾整个都符合,所以都匹配了。这个称之为贪婪匹配。

    那如何做到尽可能少的匹配。这个就需要加个?进行限制。

    例如,表达式:n.+?n

    这个表达式尽可能少匹配,也就是说碰到一次符合条件的就立马返回结果。结果可以匹配到“n123n”、“n789n”。

    这种规则叫做吝啬匹配。只要在限定符后面再加个问号即可。

    4、元字符

    元字符是用于匹配字符串,可以代表一定含义或规律的字符串。主要的元字符如下:元字符含义

    .小数点,代表除了换行符以外的任意字符

    \转义,若我想匹配一些被正则表达式占用的字符,例如小数点,可以用\.

    [abc]匹配中括号内的字符,例如[a-zA-Z],可以匹配到大小写字母

    [^abc]不匹配中括号内的字符,例如[^a-z],表示不匹配小写字母

    \w可以匹配字母、下划线和数字,相当于[a-zA-Z0-9_]

    \W大写的W是小写的w相反情况,也就是不匹配字母、下划线和数字。相当于[^a-zA-Z0-9_]

    \s匹配任意空白符,相当于[\f\n\r\t\v]

    \S匹配任意非空符,相当于[^\f\n\r\t\v]或[^\s]

    \d匹配数字,相当于[0-9]

    \D匹配非数字,相当于[^0-9]

    \b匹配单词的边界。这个匹配英文单词特别有用。例如\b[\w']+?\b就可以匹配任意单词了

    \f匹配换页符

    \n匹配换行符

    \r匹配回车符

    \t匹配tab制表符

    \v匹配垂直制表符

    ^不在中括号内的^,表示从字符串的开头开始匹配

    $表示匹配到字符串的结尾

    x|y匹配x或y

    (表达式)元组,用小括号括起来的表达式当作一个元组,可以当作一个整体,也可以被\1\2\3这样类似索引获取。

    元字符比较多,这里就建议大家先收藏,需要用的时候再查阅。多用几次就自然记住了。

    这里还有个小技巧,若我想匹配全部任意字符,包括换行符。可以用一组相反的元字符,例如[\s\S],就可以匹配全部任意字符。

    5、常见的正则表达式

    说了这么多,晕了没?看一些实例:

    1)匹配邮编,邮编是6位数字。正则表达式:\d{6}

    2)匹配手机,手机号是11位数字。正则表达式:\d{11}

    3)匹配电话,电话是区号-号码组成,区号有3到4位,号码有6到9位。正则表达式:\d{3,4}-\d{6,9}

    4)匹配日期,日期格式如1992-5-30,明显数字加横线组成。正则表达式:\d{4}-\d{1,2}-\d{1,2}

    5)匹配汉字,汉字需要通过编码转义,汉字都unicode编码中都在一个范围内。正则表达式:[\u4e00-\u9fa5]

    6、vba中使用正则表达式

    若只是上面这些内容,那么还是纸上谈兵,需要应用到实际中。看看如何在vba中使用正则表达式。

    vba使用正则表达式需要用到一个RegExp对象。

    该对象可以通过引用Microsoft VBScript Regular Expressions 5.5。再声明定义:DimregAsNewRegExp

    还可以直接用CreateObject方法创建:DimregAsObject

    setreg=CreateObject("VBScript.Regexp")

    创建RegExp对象之后,看看它的相关属性和方法。

    属性:

    1)Global,是否全局匹配,若为False,匹配到一个结果之后,就不再匹配。默认False,建议设为True;

    2)IgnoreCase,是否忽略大小写,默认False,建议设为False,这个会影响到正常表达式匹配;

    3)Multiline,是否跨行匹配,默认False,建议设为False,这个会影响到正常表达式匹配;

    4)Pattern,获取或设置正则表达式。

    方法:

    1)Execute,执行匹配

    2)Replace,根据正确表达式全部替换

    3)Test,测试正则表达式能否匹配到内容

    举一些典型的例子:

    1)判断是否存在数字PublicFunctionCheckNumber(strAsString)AsBoolean

    DimregAsObject

    Setreg=CreateObject("VBScript.Regexp")

    Dimis_existAsBoolean

    Withreg

    .Global=True

    .Pattern="\d"

    is_exist=.Test(str)

    EndWith

    CheckNumber=is_exist

    EndFunction

    用Test方法,判断能否匹配到数字。

    2)获取所有编号PublicSubGetCode()

    DimregAsObject

    Setreg=CreateObject("VBScript.Regexp")

    DimstrAsString

    str="编号:ABC123155 日期:2016-01-11"&_

    "编号:ABD134215 日期:2016-02-21"&_

    "编号:CBC134216 日期:2016-01-15"

    reg.Global=Truereg.Pattern="[A-Z]{3}\d+"'获取匹配结果'

    DimmatchesAsObject,matchAsObject

    Setmatches=reg.Execute(str)

    '遍历所有匹配到的结果'

    ForEachmatchInmatches

    '测试输出到立即窗口'

    Debug.Printmatch

    Next

    EndSub

    因为这个编号是3个大写字母和多个数字组成。可以利用代码中的表达式匹配到3个结果:ABC123155、ABD134215和CBC134216。

    3)去掉字符串中的数字PublicFunctionClearNumber(strAsString)AsString

    DimregAsObject

    Setreg=CreateObject("VBScript.Regexp")

    reg.Global=True

    reg.Pattern="\d"

    '把所有数字替换成空'

    ClearNumber=reg.Replace(str,"")

    EndFunction

    执行ClearNumber函数,即可去掉数字。例如ClearNumber("你342好234啊"),可得到"你好啊"。

    4)获取子字符串

    例如想获取某些字符串中的部分数据,可以匹配完成之后,再用字符串函数处理。但其实不用,用元组可以一次性搞定。PublicSubGetHref()

    DimregAsObject

    Setreg=CreateObject("VBScript.Regexp")

    DimstrAsString

    reg.Global=True

    '获取a标签中href的属性值'

    reg.Pattern="href='(.+?)'"

    '获取匹配结果'

    DimmatchesAsObject,matchAsObject

    Setmatches=reg.Execute(str)

    '遍历所有匹配到的结果'

    ForEachmatchInmatches

    '测试输出子表达式到立即窗口'

    Debug.Printmatch.SubMatches(0)

    Next

    EndSub

    这里,可以通过match的SubMatches集合获取元组里面的内容。轻松得到xxx1和xxx2。

    7、其他说明

    vba的正则表达式不是很完整,没有递归的功能。递归是可以匹配公式或html代码等。有兴趣可以了解一下。

    展开全文
  • vba 正则表达式

    2013-01-08 22:58:33
    正则表达式基础说明, 供初学者参考,大婶绕过
  • VBA正则表达式深度解析

    千次阅读 2020-06-26 18:07:14
    先上代码: Function GetStr(ByVal rng As ... '第三个参数i 为正则表达式成功匹配的结果列表中的第几个,从0开始,默认为0即第1个 '第四个参数s 为文本[True]或数字[False],用于剔除数字中的文本内容,默认...

    目录

    本文章可以学到:

    先上代码:

     分析:

    调式:

    细心一点会发现两个问题:

     一个一个的来解答


    本文章可以学到:

    • VBA正则表达式匹配第N个结果
    • VBA正则表达式剔除匹配包含字符的数字中剔除字符,只保留数字

    先上代码:

    Function GetStr(ByVal rng As String, str As String, Optional i As Long, Optional s As Boolean)
        '第一个参数rng    为数据源
        '第二个参数str    为正则表达式
        '第三个参数i      为正则表达式成功匹配的结果列表中的第几个,从0开始,默认为0即第1个
        '第四个参数s      为文本[True]或数字[False],用于剔除数字中的文本内容,默认为数字[False]
    
        If IsMissing(i) Then i = 0
        If IsMissing(s) Then s = False
    
        Dim iRg As Object
    
        Set iRg = CreateObject("VBscript.regexp")
        With iRg
            .Global = True
            .Pattern = str   '表达式,直接从用户函数的第二个参数中调用
    
            If .Execute(rng).Count = 0 Then
                '如果匹配到结果的量为0则
                GetStr = ""
                '返回结果为空值
                '函数结束
            Else
    
                If IsNumeric(.Execute(rng)(i)) Or s Then
                '如果第一次得到的结果是数字或者函数的第4个参数为True或非0则
                    GetStr = .Execute(rng)(i)
                    '直接返回第一次得到的结果
                    '函数结束
                Else
                    GetStr = GetStr(.Execute(rng)(i), "[0-9]+[.]{0,1}[0-9]{0,}")
                    '否则从第一次返回的结果中剔除数字以外的字符
                    '即调用函数本身再传入一个数字的正则表达式"[0-9]+[.]{0,1}[0-9]{0,}"
                End If
            End If
        End With
    End Function

     

     测试结果:

     BCDEF
    2源文本.1ss11.11cmcxzas/.'22.22cmwq.,3cmd.,/;eq4.44444cm
    3正则表达式.1[0-9]+[.]{0,}[0-9]{0,}[cm]
    4                第3参数(i)
    第4参数(s)     
    0123
    5
    6011.11   =GetStr(C2,C3,C4,B6)22.22  =GetStr(C2,C3,D4,B6)3  =GetStr(C2,C3,E4,B6)4.44444  =GetStr(C2,C3,F4,B6)
    7111.11c  =GetStr(C2,C3,C4,B7)22.22c =GetStr(C2,C3,D4,B7)3c =GetStr(C2,C3,E4,B7)4.44444c =GetStr(C2,C3,F4,B7)
    8     
    9源文本.2ss11.11cmcmxzas/.'22.22cmwq.,333333cmd.,/;eq4.44444cm
    10正则表达式.2[0-9]+[.]{0,}[0-9]{0,}[cm]+
    11                第3参数(i)
    第4参数(s)     
    0123
    12
    13011.11      =GetStr(C9,C10,C11,B13)22.22    =GetStr(C9,C10,D11,B13)333333   =GetStr(C9,C10,E11,B13)333333cm  =GetStr(C9,C10,E11,B14)
    14111.11cmcm  =GetStr(C9,C10,C11,B14)22.22cm  =GetStr(C9,C10,D11,B14)333333cm =GetStr(C9,C10,E11,B14)4.44444cm =GetStr(C9,C10,F11,B14)

     分析:

    我们从[C6]单元格开始说起

    代入目标单元格解析的公式是:

    =GetStr("ss11.11cmcxzas/.'22.22cmwq.,3cmd.,/;eq4.44444cm","[0-9]+[.]{0,}[0-9]{0,}[cm]",0,0)

     

    调式:

    在第17行代码添加断点,然后在监视窗口中添加监视:

    irg.Execute(Rng)

    双击[C6]单元格,回车就可以看到如下图所示

    可以看到这个 "[0-9]+[.]{0,}[0-9]{0,}[cm]正则表达式作用在这段"ss11.11cmcxzas/.'22.22cmwq.,3cmd.,/;eq4.44444cm"文字中,会得到4个结果,那么就可以通过传入第3个参数  i   来选择我们想要的第几个结果。

    在[C6]单元格中我们第三个参数是0,也是就返回匹配到的第0个结果,11.11c

     

    细心一点会发现两个问题:

    1. 传入的正则表达式是 "[0-9]+[.]{0,}[0-9]{0,}[cm]",末尾是 cm 为啥只匹配到了c
    2. 【C6】单元格的结果是11.11
       

     

     一个一个的来解答

    第1个问题是因为[cm]默认只匹配中括号中的第一个符号,也就是c,如果想要匹配[cm]有几种方法

    • 笨方法:[c][m]或者[cm]{2}或者[cm]{0,}
    • 好方法:[cm]+或者cm

     第2个问题是因为一般匹配的数字的时候,数字后面可能会有一些特定字符比如单位。而匹配的结果会把这些字符一起放进去,这样就不方便使用公式进行计算或者统计总数,需要二次匹配,也就是在得到一个包含字符的数字中剔除字符,只保留数字。

    关键就在24-33行代码:

                If IsNumeric(.Execute(rng)(i)) Or s Then
                '如果第一次得到的结果是数字或者函数的第4个参数为True或非0则
                    GetStr = .Execute(rng)(i)
                    '直接返回第一次得到的结果
                Else
                    GetStr = GetStr(.Execute(rng)(i), "[0-9]+[.]{0,1}[0-9]{0,}")
                    '否则从第一次返回的结果中剔除数字以外的字符
                    '即调用函数本身再传入一个数字的正则表达式"[0-9]+[.]{0,1}[0-9]{0,}"
                End If

    根据这个思路看测试结果,就很清晰明了了。

    看不明白的话把代码放在EXCEL模块里面多测试并调式就会明白了,有不明白的欢迎交流。

    展开全文
  • vba正则表达式基础

    2014-12-23 18:24:28
    vba正则表达式基础知识介绍,由浅入深,实例讲解
  • 网上测试了很多,大多数都不满意。于是自己编写了一个。VBA利用通配符或正则表达式删除Word中选中部分的多余空行,支持把手动换行符替换为段落标记处理。
  • 然而之前没学VBA里的正则表达式语法,因此就去网上搜了一下,结果发现根本不能运行。几经辗转,总算搞定,因此总结一下,供后来者参考。编程目的:实现IP地址中省市信息的提取。主要涉及的知识点:VBA函数、正则...

    背景是这样的,我手上有一份统计表,需要将IP地址里的省市提取出来,以便于处理。因此我首先想到了Python里的正则表达式,打算写一个自定义函数去批量提取。然而之前没学VBA里的正则表达式语法,因此就去网上搜了一下,结果发现根本不能运行。几经辗转,总算搞定,因此总结一下,供后来者参考。

    编程目的:实现IP地址中省市信息的提取。

    34af89fd35351dfce9b21935a00709e5.png

    主要涉及的知识点:VBA函数、正则表达式

    代码如下:

    Function 提取省市(rng As Range, name)

    Application.Volatile

    Set regx = CreateObject("vbscript.regexp")

    With regx

    .Global = True

    .Pattern = "[u4e00-u9fa5]+"

    Set mat = .Execute(rng)

    End With

    Select Case name

    Case "省"

    提取省市 = mat.Item(0).Value

    Case "市"

    提取省市 = mat.Item(1).Value

    Case Else

    MsgBox ("输入有误")

    End Select

    End Function

    代码解释:

    1、rng As Range, name:传递两个参数,第一个参数为单元格参数。

    2、Application.Volatile  Set regx = CreateObject("vbscript.regexp"):创建正则表达式对象,固定语法。

    3、With regx

    .Global = True

    .Pattern = "[u4e00-u9fa5]+"

    Set mat = .Execute(rng)

    End With

    Global:表示是否进行全局检索,True表示将所有匹配的结果返回。False则是只返回第一个匹配结果。

    Pattern = "[u4e00-u9fa5]+"就是正则表达式了,其中[u4e00-u9fa5]+表示匹配中文字符串。

    4、Set mat = .Execute(rng):即执行正则表达式。返回一个matchcollection类型的集合,即匹配到的所有结果。

    5、接下来是一个多条件判断语句,相当于If ...Elif... Else...End If 。

    6、提取省市 = mat.Item(0).Value:前面我们提到mat是一个matchcollection类型的集合,mat.Item(0)表示读取第一个匹配结果,Value表示读取它的值。最后将这个值赋给函数。也可以不用后面的value。

    展开全文
  • 下面一段代码是关于正在表达式判断是否为手机号码的代码,具体代码如下所述: ...以上所述是小编给大家介绍的使用正则表达式判断是否为手机号码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时
  • ps:下面看下利用正则表达式提取括号内内容 比如现在要提取 中华人们共和国,简称(中国) 这句话中括号里的“中国” import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { ...
  • VBA正则表达式.doc

    2021-10-01 10:55:35
    VBA正则表达式.doc
  • VBA正则表达式入门与提高

    万次阅读 多人点赞 2019-05-10 11:30:37
    精通正则表达式>>专业书籍是世人公认的正则权威著作.但它不太适合初学者,尤其是没有相关编程语言背景及书中所及的种种计算机技术知识的读者.其中很多晦涩难懂的内容在VBA中用不上或者对你来说根本无用的,而...
  • VBA正则表达式入门与提高.pdf
  • 正则表达在文字处理非常好用,可以进行复杂的字符串筛选判断,用于各种输入校验,字符串查找、替换,以及提取操作。
  • VBA中的正则表达式

    2014-12-23 18:22:58
    VBA中的正则表达式,正则表达式的基本知识讲解!
  • Excel-VBA正则表达式提取文本案例

    千次阅读 2019-10-02 23:47:44
    然而之前没学VBA里的正则表达式语法,因此就去网上搜了一下,结果发现根本不能运行。几经辗转,总算搞定,因此总结一下,供后来者参考。  有几点说明:  1、我是先在 Python中验证了正则表达式再copy到VBA中应用...
  • VBA正则表达式

    2019-11-10 12:21:56
    目的,想要将日期变成YYYYMMDD的格式 不喜欢讲理论,直接看代码 Public Function yestoday() ...关键点在regx.Pattern = “(\d{4})-(\d{2})-(\d{2})”,关于正则表达式的写法,请参考 效果
  • VBA正则提取A字符串之后B字符串之前中间的内容.txt
  • 正则表达式测试工具,美观功能强大! 1、可作为文本编辑器,支持简洁模式,字号变大变小,字体设置,颜色设置,对齐方式,行间距设置 2、多页面可保存 3、支持正则表达式匹配与替换,子匹配单独显示,单独选择 4、...
  • EXCEL VBA 正则表达式

    万次阅读 2017-07-06 16:15:09
     正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程: ...
  • EXCEL VBA 正则表达式 MatchCollection对象

    千次阅读 2016-12-03 23:07:55
     正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程: ...
  • 正则表达式入门教程 VBA [ 日期2011-08-25] 来源 作者 admin [字体 大 中 小] 引言 正则表达式 regular expression 就是用一个 字符串来描述一个特征 然后去验证另一个 字符串是否符合这个特征 比如 表 达式 ab+ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,420
精华内容 568
关键字:

vba正则表达式

友情链接: helloa.rar