Excel精英培训网

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

[已解决]VBA 正则█ .Pattern = "^.{4,8}(?=.*\d)$ 为何不对?

[复制链接]
发表于 2015-11-29 17:30 | 显示全部楼层 |阅读模式
本帖最后由 砂海 于 2015-12-21 12:57 编辑

例:验证密码,条件是4-8位,必须包含一个数字

.Pattern = "^(?=.*\d).{4,8}$ 这样可以

.Pattern = "^.{4,8}(?=.*\d)$    为何 这样不可以
.Pattern = "^.{4,8}(?=.*\d.*)$  也不行

求真相.
最佳答案
2016-2-13 23:33
(?=.*\d)$
你是肯定没有真正理解零宽断言,正向预查不消耗字符,但是你必须得满足断言的要求
(?=.*\d)代表匹配字符串由0至多个任意字符+一个数字组成,但真正的后面你却直接跟了$,能匹配才是怪了
(?=.*\d)as2$这就满足要求了
给你举个例子  (?=a)b        (?=a)代表后面出现的第一个字符必须为a,但真正的却跟了b.要要后面紧跟a,又要跟b,哪能满足
(?=a)a  这样才是对的



发表于 2016-2-13 23:33 | 显示全部楼层    本楼为最佳答案   
(?=.*\d)$
你是肯定没有真正理解零宽断言,正向预查不消耗字符,但是你必须得满足断言的要求
(?=.*\d)代表匹配字符串由0至多个任意字符+一个数字组成,但真正的后面你却直接跟了$,能匹配才是怪了
(?=.*\d)as2$这就满足要求了
给你举个例子  (?=a)b        (?=a)代表后面出现的第一个字符必须为a,但真正的却跟了b.要要后面紧跟a,又要跟b,哪能满足
(?=a)a  这样才是对的



回复

使用道具 举报

 楼主| 发表于 2016-2-14 09:39 | 显示全部楼层
心不再流泪 发表于 2016-2-13 23:33
(?=.*\d)$
你是肯定没有真正理解零宽断言,正向预查不消耗字符,但是你必须得满足断言的要求
(?=.*\d)代表 ...
新年好.


"零宽" 似乎 明白了.
-----------------
(?=.*\d)as2$
--------------------上面这句又糊涂了, 这句 在VBA中 测试结果不对.
求解.
以下为源程序.
--------------------
   '例:验证密码,条件是4-8位,必须包含一个数字
      Sub t355()
        Dim regex As New RegExp
        Dim sr, mat, m
        sr = "A8ayaa"
        With regex
          .Global = True
           .Pattern = "^(?=.*\d).{4,8}$"
            Set mat = .Execute(sr)
            For Each m In mat
              Debug.Print m
            Next m
        End With
      End Sub
回复

使用道具 举报

发表于 2016-2-14 10:25 | 显示全部楼层
(?=.*\d)as2$
这是我举例不对,
我只是想表达as2满足(?=.*\d)这样的条件
(?=.*\d)as2$  其实就是as2$
回复

使用道具 举报

 楼主| 发表于 2016-2-14 10:27 | 显示全部楼层
心不再流泪 发表于 2016-2-14 10:25
(?=.*\d)as2$
这是我举例不对,
我只是想表达as2满足(?=.*\d)这样的条件

    {:3512:}{:3512:}{:3512:}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 11:51 , Processed in 0.242288 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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