|
楼主 |
发表于 2012-2-24 17:31
|
显示全部楼层
本帖最后由 爱疯 于 2012-2-24 18:14 编辑
我现在,又清晰了。看说的对不对?
1、解释12#
如果不好理解12#,可把x的值换下
- Sub Test2()
- Dim regex As Object, matchs As Object, match As Object
- Dim x As String, y As String, z As String
- x = "1斤苹果 2元,3斤梨 4元,5斤香蕉 6元"
- y = "\d+\.?\d*(?!斤)"
- Set regex = CreateObject("VBScript.RegExp")
- With regex
- .Global = True
- .Pattern = y
- Set matchs = .Execute(x)
- Debug.Print "值", "位置", "长度"
- For Each match In matchs
- Debug.Print match.Value, match.firstindex, match.Length
- Next
- End With
- End Sub
复制代码 即所有数字都只有1位,这样负预测,看似可得到“3个价格的数字”了,但这是有隐患的,不准确的,有条件的 ------ 数字必须只1位。当换成12#那样,隐患就显现出来了。理由如7#和8#。
2、13#例子
我简化了例中的值,只为好数(那么多你你你。。。。。眼都花了),我觉得理解了这样,其它就能理解了。
- Sub Test1()
- Dim regex As Object, matchs As Object, match As Object
- Dim x As String, y As String, z As String
- x = "abcdee"
- y = ".+(?!e)"
- Set regex = CreateObject("VBScript.RegExp")
- With regex
- .Global = True
- .Pattern = y
- MsgBox .Execute(x)(0)
- MsgBox .Execute(x).Count
- End With
- End Sub
复制代码 为什么结果仍是"abcdee"呢?
除^、$、\b外,当零度断言时,“位置”(^、$、\b)也将参入预测。(从13#例子中发现的)
首先,".+(?!e)"是贪婪模式。于是先考虑所有字符。"abcdee"后不是e而是$(字符串末尾,只是一个位置,但也被用来预测),符合条件,所以"abcdee"是匹配值。尽管"abc"也符合,但贪婪模式追求尽可能长。
当y = ".+(?!e|$)"时,分支决定.+。分支左边产生匹配值"abc"后,就不再查找了(尽管分支右边"abcdee"也符合,但分支总是优先考虑靠左的)
|
|