Excel精英培训网

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

[已解决]正则表达式改错题

[复制链接]
发表于 2011-11-8 12:04 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2012-11-27 11:27 编辑
  1. Sub Test7()
  2.     Dim regex As Object, matchs As Object, match As Object
  3.     Dim x As String, y As String
  4.     x = "主板720元,硬盘680元,内存320元"
  5.     Set regex = CreateObject("VBScript.RegExp")
  6.     With regex
  7.         .Global = True
  8. '        .Pattern = "\d+(?=元)" '720680320
  9.         .Pattern = "(?<=硬盘)\d" '错误5017
  10. '        .Pattern = "(?<=硬盘)\d+(?=元)" '错误5017
  11.         Set matchs = .Execute(x)
  12.         For Each match In matchs
  13.             y = y & match
  14.         Next
  15.     End With
  16.     MsgBox y    '希望返回680
  17. End Sub
复制代码
请问:怎样修改正则表达式,只返回硬盘价格的数字,680.
谢谢!
PS:如果能告知错误5017产生原因,就更好了
最佳答案
2011-11-8 13:22
零宽断言的四种基本形式,VBA中不支持后发断言,以下是我四种形式的举例
  1. Sub test()
  2. Dim x$, regex As New RegExp, matchs, match
  3. x = "主板720元,硬盘680元,内存320角"
  4. With regex
  5.     .Global = True
  6. '    .Pattern = "\d+(?=元)" '零宽度正预测先行断言,返回值正确720 680
  7. '    .Pattern = "(?<=硬盘)\d+" '零宽度正回顾后发断言,返回值错误,应返回680
  8. '    .Pattern = "\d{3}(?!角)" '零宽度负预测先行断言,返回值正确720 680
  9. '    .Pattern = "(?<!硬盘)\d+" '零宽度正回顾后发断言,返回值错误,应返回720 320
  10.     Set matchs = .Execute(x)
  11.     For Each match In matchs
  12.         MsgBox match
  13.     Next
  14. End With
  15. End Sub
  16. '推断: 在VBA中不支持后发断言
复制代码
而在正则表达式测试工具中都是可以有返回的,所此可有此推断。基本情况可能这是这样
发表于 2011-11-8 12:41 | 显示全部楼层
vba中的正则表达式引挚可能不支持后发零宽断言,可采用后用引用的办法来解决:
  1. Sub Test7()
  2.     Dim regex As Object
  3.     Dim x As String, y As String
  4.     x = "主板720元,硬盘680元,内存320元"
  5.     Set regex = CreateObject("VBScript.RegExp")
  6.     With regex
  7.         .Global = True
  8.         .Pattern = "硬盘(\d+)"
  9.         MsgBox .Replace(.Execute(x)(0), "$1")   '希望返回680
  10.     End With
  11. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2011-11-8 12:50 | 显示全部楼层
谢谢snrvgbb!
学习小括号的好处。
希望能找出错误原因。
回复

使用道具 举报

发表于 2011-11-8 12:59 | 显示全部楼层
不存在改错的问题,.Pattern =(?<=硬盘)\d+的表达式是正确的,只是引挚支持不同罢了!
回复

使用道具 举报

 楼主| 发表于 2011-11-8 13:09 | 显示全部楼层
是不是说VBA里无法运行,报错5017,也可能不是正则表达式的错误?
对于本例这样的情况,无法用正则表达式一次完成?
.... 因为老听说正则表达式强大,所以不敢相信
回复

使用道具 举报

发表于 2011-11-8 13:22 | 显示全部楼层    本楼为最佳答案   
零宽断言的四种基本形式,VBA中不支持后发断言,以下是我四种形式的举例
  1. Sub test()
  2. Dim x$, regex As New RegExp, matchs, match
  3. x = "主板720元,硬盘680元,内存320角"
  4. With regex
  5.     .Global = True
  6. '    .Pattern = "\d+(?=元)" '零宽度正预测先行断言,返回值正确720 680
  7. '    .Pattern = "(?<=硬盘)\d+" '零宽度正回顾后发断言,返回值错误,应返回680
  8. '    .Pattern = "\d{3}(?!角)" '零宽度负预测先行断言,返回值正确720 680
  9. '    .Pattern = "(?<!硬盘)\d+" '零宽度正回顾后发断言,返回值错误,应返回720 320
  10.     Set matchs = .Execute(x)
  11.     For Each match In matchs
  12.         MsgBox match
  13.     Next
  14. End With
  15. End Sub
  16. '推断: 在VBA中不支持后发断言
复制代码
而在正则表达式测试工具中都是可以有返回的,所此可有此推断。基本情况可能这是这样
回复

使用道具 举报

发表于 2011-11-8 13:26 | 显示全部楼层
准确的说不是正则表达式不强大,而是VBA中的正则表达式的局限。我的理解!
回复

使用道具 举报

发表于 2011-11-8 14:53 | 显示全部楼层
VBScripting库不支持吧。
一般的处理方式就是用分组来获取,或两次匹配
或者引用其他的正则库,JS等等。
回复

使用道具 举报

 楼主| 发表于 2011-11-8 15:55 | 显示全部楼层
谢谢liuguansky !

学习了,原来是不支持。
名字好难记哦,分不清。不支持就不记了,免得记乱了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 06:06 , Processed in 0.214612 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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