1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何用正则找出有且只有3次重复的数字

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-13 10:39 | 显示全部楼层 |阅读模式
需求1:同样的数字存在3次重复,如果也存在3次以上的重复,此数字找出
例如:0.366---.777+++.5-.9999999//0.8--0.333+0.3333
要找出的数字为777和333,不能从9999999找出999

需求2:同样的数字存在3次重复,但如果也存在3次以上的重复,此数字不能找出
例如:0.366---.777+++.5-.9999999//0.8--0.333+0.3333
要找出的数字777,不能从9999999找出999,也不能找出333

要求,只能使用正则方法直接找出。

TA的精华主题

TA的得分主题

发表于 2025-4-13 10:52 | 显示全部楼层
两个程序啊,还限定用正则,不用不可以?

TA的精华主题

TA的得分主题

发表于 2025-4-13 12:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 taller 于 2025-4-13 12:53 编辑

'等待正则高手分享正则直接找出的代码




  1. Sub FindThreeRepeatedDigits() ' 正则匹配之后再核查之前和之后的字符
  2.     Dim regEx As Object
  3.     Set regEx = CreateObject("VBScript.RegExp")
  4.     ' 匹配连续3个相同数字
  5.     regEx.Pattern = "(\d)\1\1"
  6.     regEx.Global = True
  7.    
  8.     Dim s As String
  9.     ' 示例字符串
  10.     s = "0.366---.777+++.5-.9999999//0.8--0.333+0.3333"
  11.    
  12.     Dim matches As Object, m As Object
  13.     Set matches = regEx.Execute(s)
  14.     Dim posStart As Long, posEnd As Long
  15.     Dim repeatedDigit As String
  16.     Dim isValid As Boolean
  17.    
  18.     ' 对每个匹配,检查是否正好是3个连续相同数字
  19.     For Each m In matches
  20.         ' VBA字符串采用1为起始,RegExp的FirstIndex基于0
  21.         posStart = m.FirstIndex + 1
  22.         posEnd = posStart + m.Length - 1
  23.         ' m.SubMatches(0) 就是重复数字(第1个捕获组)
  24.         repeatedDigit = m.SubMatches(0)
  25.         isValid = True
  26.         
  27.         ' 检查匹配前一个字符(如果存在),判断是否与重复数字相同
  28.         If posStart > 1 Then
  29.             If Mid(s, posStart - 1, 1) = repeatedDigit Then
  30.                 isValid = False
  31.             End If
  32.         End If
  33.         
  34.         ' 检查匹配后一个字符(如果存在),判断是否与重复数字相同
  35.         If posEnd < Len(s) Then
  36.             If Mid(s, posEnd + 1, 1) = repeatedDigit Then
  37.                 isValid = False
  38.             End If
  39.         End If
  40.         
  41.         ' 输出结果
  42.         If isValid Then
  43.             Debug.Print m.Value
  44.         End If
  45.     Next m
  46. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-13 16:38 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-13 16:42 | 显示全部楼层
Sub tttt()
Dim reg As Object, strTxt$, d1 As Object, oKey, k%
Set d1 = CreateObject("scripting.dictionary")
Set reg = CreateObject("vbscript.regexp")
strTxt = "0.366---.777+++.5-.9999999//0.8--0.333+0.3333"
k = 0
With reg
   .Global = True
   .Pattern = "((\d)\2{2})\2*"
   Set mat = .Execute(strTxt)
   If .test(strTxt) Then
      For Each matt In mat
         d1(matt.submatches(0)) = d1(matt.submatches(0)) + 1
         If matt = matt.submatches(0) Then a = a & "," & matt: k = k + 1
      Next matt
   End If
End With
If k = 0 Then MsgBox "符合需求1的连续重复数字不存在.": Exit Sub
Debug.Print Mid(a, 2)  '需求1

For Each oKey In d1.Keys()
   If d1(oKey) > 1 And InStr(a, oKey) > 0 Then
      a = Replace(a, "," & oKey, "")
   End If
Next oKey
If a = "" Then MsgBox "符合需求2的连续重复数字不存在.": Exit Sub
Debug.Print Mid(a, 2)  '需求2

End Sub

image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-13 16:48 | 显示全部楼层
此问题的进一步需求是:
需求3:用aaa替换符合需求1的连续数字
示例结果:0.366---.aaa+++.5-.9999999//0.8--0.aaa+0.3333

需求4:用bbb替换符合需求2的连续数字
示例结果:0.366---.aaa+++.5-.9999999//0.8--0.333+0.3333

TA的精华主题

TA的得分主题

发表于 2025-4-13 17:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ynzsvt 于 2025-4-13 17:46 编辑

4个程序已经完成了几个
777.366---.777+++.5-.9999999//0.8--0.333+0.3333的4个输出结果分别是什么。

TA的精华主题

TA的得分主题

发表于 2025-4-13 18:01 | 显示全部楼层
wps函数即可:
REGEXP(A1,"(^|\D)(\d)\2{2}(?!\d)",2,"\1aaa")
=REGEXP(A1,"(^|\D)(\d)\2{2}(?!\d)(?!.*?\2{4})",2,"\1bbb")该表达式仅适合多位数在后面情况。

TA的精华主题

TA的得分主题

发表于 2025-4-14 18:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 正则提取三连数()
  2. Dim St$, St1$, Arr(1 To 4), Reg As Object, Dic As Object
  3. Dim Mat, Matt, Fg
  4. Fg = "/"
  5. St = "777.366---.777+++.5-.9999999//0.8--0.333+0.3333"
  6. ' 按无匹配先出结果
  7. Arr(1) = "无"
  8. Arr(2) = "无"
  9. Arr(3) = St
  10. Arr(4) = St
  11. ' 正则取得连续4个及以上数字的建立字典
  12. Set Reg = CreateObject("vbscript.regexp")
  13. Set Dic = CreateObject("Scripting.Dictionary")

  14. With Reg
  15.   .Global = True
  16.   .Pattern = "(\d)\1{3,}"
  17.   Set Mat = .Execute(St)
  18.   If .test(St) Then
  19.    For Each Matt In Mat
  20.     St1 = Matt.submatches(0)
  21.     Dic(St1) = ""
  22.    Next 'matt
  23.   End If
  24. End With

  25. ' 正则取得连续3个数的得到规则1规则3结果
  26. ' 正则取得连续3个数的得到规则2规则4结果
  27. With Reg
  28.   .Global = True
  29.   .Pattern = "(\d)\1{2,}"
  30.   Set Mat = .Execute(St)
  31.   If .test(St) Then
  32.    For Each Matt In Mat
  33.     If Matt.Length = 3 Then
  34.      St1 = Matt.submatches(0)
  35.      If Dic.Exists(St1) Then
  36.       Arr(1) = Arr(1) & Fg & Matt
  37.       Arr(3) = Left(Arr(3), Matt.FirstIndex) & Replace(Arr(3), Matt, "aaa", Matt.FirstIndex + 1, 1)
  38.      Else
  39.       Arr(1) = Arr(1) & Fg & Matt
  40.       Arr(2) = Arr(2) & Fg & Matt
  41.       Arr(3) = Left(Arr(3), Matt.FirstIndex) & Replace(Arr(3), Matt.Value, "aaa", Matt.FirstIndex + 1, 1)
  42.       Arr(4) = Left(Arr(4), Matt.FirstIndex) & Replace(Arr(4), Matt.Value, "aaa", Matt.FirstIndex + 1, 1)
  43.      End If
  44.     End If
  45.    Next 'matt
  46.    Arr(1) = Mid(Arr(1), 3)
  47.    Arr(2) = Mid(Arr(2), 3)
  48.   End If
  49. End With

  50. [b1:e1] = Arr

  51. Set Dic = Nothing
  52. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-14 19:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
厉害。
手上没有鲜花,否则献上。

如果增加
InStr(Arr(1), Matt) = 0
InStr(Arr(2), Matt) = 0
的判断。
正是所需要的结果。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-25 05:26 , Processed in 0.037027 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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