ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: willin2000

[Excel 程序开发] [第44期]删除字符串中连续的重复词

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-6 22:27 | 显示全部楼层
第一次参赛。答案已发送

第四次发答案了,提供了40种写法。

  1. Sub DBLDel()
  2. Dim regEx As Object ' 建立变量
  3. Set regEx = CreateObject("vbScript.RegExp") ' 建立正则表达式
  4. regEx.Global = True '全程查找(若非全程查找则只进行一次匹配)
  5. 'regEx.IgnoreCase = True ' 设置是否区分大小写
  6. sourstr = [A1] & " "
  7. regEx.Pattern = "\b((\w)+\s)?\1+" ' 要找的字符串,下面是40中表达式的写法
  8. '\b([a-zA-Z0-9]+ )?\1+
  9. '\b([!-~]+ )?\1+
  10. '\b((\w)+\s)?\1+
  11. '\b((\w)+ )?\1+
  12. '\b([a-zA-Z0-9]+\s)?\1+
  13. '\b([!-~]+\s)?\1+
  14. '\b((\w*)\s)?\1+
  15. '\b((\w*)\ )?\1+
  16. '\b([!-~]* )?\1+
  17. '\b(([!-~]*)\s)?\1+
  18. '\b([a-zA-Z0-9]* )?\1+
  19. '\b((\w)*\s)?\1+
  20. '\b((\w)* )?\1+
  21. '\b([a-zA-Z0-9]*\s)?\1+
  22. '\b((\w+)\s)?\1+
  23. '\b((\w+)\ )?\1+
  24. '\b((.)+?\s)?\1+
  25. '\b((.)+? )?\1+
  26. '\b((.)*?\s)?\1+
  27. '\b((.)*? )?\1+
  28. '
  29. '([a-zA-Z0-9]+\s)?\1+
  30. '([!-~]+ )?\1+
  31. '((\w)+\s)?\1+
  32. '((\w)+ )?\1+
  33. '([a-zA-Z0-9]+\s)?\1+
  34. '([!-~]+\s)?\1+
  35. '((\w*)\s)?\1+
  36. '((\w*) )?\1+
  37. '([!-~]* )?\1+
  38. '(([!-~]*)\s)?\1+
  39. '([a-zA-Z0-9]* )?\1+
  40. '((\w)*\s)?\1+
  41. '((\w)* )?\1+
  42. '([a-zA-Z0-9]*\s)?\1+
  43. '((\w+)\s)?\1+
  44. '((\w+) )?\1+
  45. '((.)+?\s)?\1+
  46. '((.)+? )?\1+
  47. '((.)*?\s)?\1+
  48. '((.)*? )?\1+
  49. sourstr = regEx.Replace(sourstr, "$1") ' 替换
  50. [A1] = Trim(sourstr)
  51. Set regEx = Nothing
  52. End Sub
复制代码
后20个有误,LDYXCD XCD XCD XCDXCD LDY的结果不正确. 该程序的结果是LDYXCD XCDXCD LDY,但应该是LDYXCD XCD XCDXCD LDY
前20个表达式正确. 谢谢提供这么多的表达式供大家参考, 另加1分, 评3分. -willin2000

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-2-11 13:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-2-12 08:07 | 显示全部楼层
答案已发送
  1. Sub DBLDel()
  2. Dim regEx As RegExp    '先期引用regExp对象
  3. Dim str1 As String
  4. Dim rg As Range
  5. 'Dim regEx As Object    '如果没有引用中勾选regExp对象,则使用ctreatobject创建
  6. 'Set regEx = CreateObject("vbScript.RegExp")
  7. Set regEx = New RegExp
  8. Set rg = Sheet1.Range("A1")
  9. regEx.Global = True
  10. str1 = rg.Value & " "
  11. regEx.Pattern = "(\w+ )?\1+"
  12. 'rg.Offset(1) = Trim(regEx.Replace(str1, "$1"))
  13. rg = Trim(regEx.Replace(str1, "$1"))
  14. Set regEx = Nothing
  15. Set rg = Nothing
  16. End Sub
复制代码
程序有误,LDYXCD XCD XCD XCDXCD LDY运行结果是LDYXCD XCDXCD LDY,但应该是LDYXCD XCD XCDXCD LDY. 评1分. -willin2000

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-2-20 00:06 | 显示全部楼层
凑个数,实在想不出好办法。

方法不正确, 不适用较多ID很多重复的情况. 不得分. -willin2000

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-5 00:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的代码,也适用连接的空是多个的情况:
  1. Sub DBLDel()
  2. With CreateObject("VBSCRIPT.REGEXP")
  3.     .IgnoreCase = True
  4.     .Global = True
  5.     .Pattern = "(\b\w+)(\s+\1\b)+"
  6.     [a1] = .Replace([a1], "$1")
  7. End With
  8. End Sub
复制代码


以下代码能显示用分组查找到的各个串位置和串,供学习正则的网友参考:
  1. '引用Microsfot VBScript Regular Expressions ?.?
  2. Sub DBLDel()
  3. Dim matches As MatchCollection
  4. Dim RetStr$
  5. With CreateObject("VBSCRIPT.REGEXP")
  6.     .IgnoreCase = True
  7.     .Global = True
  8.     .Pattern = "(\b\w+)(\s+\1\b)+"
  9.     Set matches = .Execute([a1])
  10.     For Each Match In matches
  11.         RetStr = RetStr & "Match found at position "
  12.         RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
  13.         RetStr = RetStr & Match.Value & "'." & vbCrLf
  14.     Next
  15.     MsgBox RetStr
  16.     [a1] = .Replace([a1], "$1")
  17. End With
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2009-6-4 08:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习了,正则表达式好强大

TA的精华主题

TA的得分主题

发表于 2019-8-20 20:15 | 显示全部楼层
willin2000 发表于 2009-3-5 00:35
我的代码,也适用连接的空是多个的情况:

以下代码能显示用分组查找到的各个串位置和串,供学习正则的网友 ...

我的这个代码,不仅适应于连接的空格是多个的情况,而且还适应:
1、字符串开始和(或)结尾出现多个空格的情况,
2、重复项非连续的情况,
3、被空格分隔的ID包含汉字字符的情况。

  1. Sub DBLDel()
  2. With CreateObject("vbscript.regexp")
  3. '    .Ignorecase = True'是否忽略大小写可根据条件定
  4.     .Global = True
  5.     .Pattern = ".*?( |^)([^ ]+)(?= *$|( ))(?!.* \2(?: |$))|.+"
  6.     [a1] = .Replace([a1].Value, "$2$3")
  7. End With
  8. End Sub
复制代码
该正则表达式的详细分析,请参见:
[技巧]正则表达式万能公式应用实例:在一个字符串内按分隔符提取不重复项

http://club.excelhome.net/thread-1486825-1-1.html
(出处: ExcelHome技术论坛)



评分

2

查看全部评分

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 01:09 , Processed in 0.032995 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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