Excel精英培训网

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

[已解决]正则问题 - 零宽度负预测先行断言一例

[复制链接]
发表于 2012-2-24 15:14 | 显示全部楼层 |阅读模式

  1. Sub Test()
  2.     Dim regex As Object, matchs As Object, match As Object
  3.     Dim x As String, y As String, z As String
  4.     x = "100斤苹果 100元,30斤梨 60元,5斤香蕉 8.5元"
  5. '    y = "\d+\.?\d*(?=斤)"
  6.     y = "\d+\.?\d*(?!斤)"
  7.     Set regex = CreateObject("VBScript.RegExp")
  8.     With regex
  9.         .Global = True
  10.         .Pattern = y
  11.         Set matchs = .Execute(x)
  12.         Debug.Print "值", "位置", "长度"
  13.         For Each match In matchs
  14.             Debug.Print match.Value, match.firstindex, match.Length
  15.             z = z & match
  16.         Next
  17.     End With
  18.     '    Debug.Print z
  19. End Sub
复制代码

只启用第1个y的赋值句,能理解,返回:
值            位置          长度
100            0             3
30             12            2
5              21            1


但如果只启用第2个y的赋值句,就不理解了。我预想会得到3个的价格数字。可实际却是:
值            位置          长度
10             0             2
100            7             3
3              12            1
60             17            2
8.5            26            3



请问:只启用第2个y的赋值句,为什么会得到如上结果。谢谢!
最佳答案
2012-2-24 15:57
....已经说了,0匹配?!斤。这个匹配不占位置的[也就是说不会显示为匹配结果,只是用于判断]。

正如(?=exp)
匹配的结果中是不含exp的
发表于 2012-2-24 15:28 | 显示全部楼层
y = "\d+\.?\d*(?![斤\d])"
这样试试
因为数字也可以匹配到(?!斤)
回复

使用道具 举报

发表于 2012-2-24 15:31 | 显示全部楼层
另外 小数的话建议是
\d+((\.\d+)|(\d*))
回复

使用道具 举报

 楼主| 发表于 2012-2-24 15:34 | 显示全部楼层
[斤\d]

含义:从汉字"斤"和一个数字,两者之中任选之一?

点评

是的,就是不让数字来匹配?斤  发表于 2012-2-24 15:36
回复

使用道具 举报

发表于 2012-2-24 15:39 | 显示全部楼层
  1. "\d+\.?\d*(?!斤|\d)"
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-2-24 15:53 | 显示全部楼层
谢谢花花lius!
学习了两位的解决方法,和更保险的写法。

我理解:
1. 零宽度正预测先行断言(?=exp):匹配结果后是exp
所以,(?=斤)表示匹配结果后是斤
2.零宽度负预测先行断言(?!exp):匹配结果后不是exp
同理,(?!斤)应该表示匹配结果后不是斤
那么,x第一次被匹配的时候,为什么匹配的是10,而不是100?
回复

使用道具 举报

发表于 2012-2-24 15:57 | 显示全部楼层    本楼为最佳答案   
....已经说了,0匹配?!斤。这个匹配不占位置的[也就是说不会显示为匹配结果,只是用于判断]。

正如(?=exp)
匹配的结果中是不含exp的
回复

使用道具 举报

发表于 2012-2-24 16:01 | 显示全部楼层
它认定,0和!斤相符,所以0前面的10被匹配到啦
回复

使用道具 举报

 楼主| 发表于 2012-2-24 16:01 | 显示全部楼层
liuguansky 发表于 2012-2-24 15:57
....已经说了,0匹配?!斤。这个匹配不占位置的[也就是说不会显示为匹配结果,只是用于判断]。

正如(?= ...

我理解你这句话。
x第一次被匹配时,我认为也可以这样:

匹配数字100,斤匹配?!斤。这个匹配不占位置的[也就是说不会显示为匹配结果,只是用于判断]。

为什么第一次被匹配值不是100?
回复

使用道具 举报

 楼主| 发表于 2012-2-24 16:02 | 显示全部楼层
liuts 发表于 2012-2-24 16:01
它认定,0和!斤相符,所以0前面的10被匹配到啦

它为什么认定这是唯一的匹配方式呢?

点评

100后面是斤啊,不符合条件  发表于 2012-2-24 17:07
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 16:32 , Processed in 0.499160 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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