ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 正则表达式+数组提取数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-4-14 03:52 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 Groove 于 2019-4-14 18:51 编辑

我用正则表达式+数组提取数据我需要的文字符串 (提最第一个出现的组合英文+数字), 之后再出现相同组合都不要,
但数组中arr会返回一些我不需要的文字符串. 因为我需要用上数组加快数据生成, 数组方面应该怎改
求大神们教路.
---------------------------------------------------------------------
Sub regular()
Dim text, i&, reg As Object
Set reg = CreateObject("vbscript.regexp")
Range("B:B").ClearContents
arr = Worksheets("AAA").Range("A1").CurrentRegion
For i = 2 To UBound(arr)
    text = Cells(i, 1)
        With reg
            .Global = False
            .ignorecase = True
            .Pattern = " ([a-zA-z]+[0-9]+) "
                For Each Item In .Execute(text)
                    arr(i, 1) = Item.submatches(0)
                Next
            End With
Next i
Range("B1").Resize(UBound(arr)) = arr
End Sub


regular.PNG

extrat.rar

153.96 KB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2019-4-14 09:28 | 显示全部楼层
自定义函数,D2=tq(B2,"\b[a-zA-Z]\w+\d\b",1),自己测试下
Function tq(Str As Variant, Pattern As String, Optional num As Integer) As String
    Dim r As Object, mh As Object
    Set r = CreateObject("vbscript.regexp")
    With r
        .Pattern = Pattern
        .Global = True
        If .test(Str) Then
            Set mhs = .Execute(Str)
            If num = 0 Then
                For Each mh In mhs
                    tq = tq & Chr(10) & mh.Value
                Next
                tq = Right(tq, Len(tq) - 1)
            Else
                tq = mhs(num - 1)
            End If
        Else
            tq = ""
        End If
    End With
    Set r = Nothing
    Set mhs = Nothing
End Function

TA的精华主题

TA的得分主题

发表于 2019-4-14 09:41 | 显示全部楼层
  1. Sub regular()
  2. Dim text, i&, reg As Object
  3. Set reg = CreateObject("vbscript.regexp")
  4. Range("B:B").ClearContents

  5. arr = Worksheets("AAA").Range("A1").CurrentRegion
  6. For i = 2 To UBound(arr)
  7.     text = Cells(i, 1)
  8.         With reg
  9.             .Global = False
  10. '            .ignorecase = True
  11.             .Pattern = " ([a-zA-z]+[0-9]+) "
  12.             If .test(text) Then
  13.                 arr(i, 1) = .Execute(text)(0)
  14.             Else
  15.                 arr(i, 1) = ""
  16.             End If
  17. '                For Each Item In .Execute(text)
  18. '                    arr(i, 1) = Item.submatches(0)
  19. '                Next
  20.             End With
  21. Next i

  22. Range("B1").Resize(UBound(arr)) = arr
  23. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-4-14 09:42 | 显示全部楼层
详见附件,在楼主原代码上做的调整,供参考

extrat.zip

184.89 KB, 下载次数: 46

TA的精华主题

TA的得分主题

发表于 2019-4-14 11:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub zz()
  2. Dim b()
  3. a = [a2:a10]: ReDim b(1 To UBound(a), 1 To 1)
  4. With CreateObject("vbscript.regexp")
  5.     .Pattern = ".*? (\b[a-zA-Z]+\d+\b).*"
  6.     For i = 1 To UBound(a)
  7.         If .test(a(i, 1)) Then b(i, 1) = .Replace(a(i, 1), "$1")
  8.     Next
  9. End With
  10. [d2].Resize(i - 1) = b
  11. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-4-14 13:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub RegExpDemo()
  2.     Dim strTxt As String
  3.     Dim objRegEx As Object, objMatch As Object
  4.     Dim objMH As Object, c As Range
  5.     Set objRegEx = CreateObject("vbscript.regexp")
  6.     objRegEx.Pattern = "\b([a-zA-Z]+\d+)\b.*"
  7.     objRegEx.Global = True
  8.     'objRegEx.MultiLine = True
  9.     Set datarng = Range([a2], [a2].End(xlDown))
  10.     datarng.Offset(0, 1).ClearContents
  11.     For Each c In datarng
  12.         strTxt = c.Value
  13.         Set objMatch = objRegEx.Execute(strTxt)
  14.         If objMatch.Count > 0 Then
  15.             c.Offset(0, 1).Value = objMatch(0).submatches(0)
  16.         End If
  17.     Next
  18.     Set objMH = Nothing
  19.     Set objMatch = Nothing
  20.     Set objRegEx = Nothing
  21. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-4-14 14:34 | 显示全部楼层
数据不是很复杂,Split 和 Like 可以搞定

11000.png

  1. Sub test()
  2.     ar = [a2:a10]
  3.     For i = 1 To UBound(ar)
  4.         k = Split(ar(i, 1), " ")
  5.         For j = 0 To UBound(k)
  6.             If k(j) Like "[a-zA-Z]*#" Then
  7.                 x = 1
  8.                 GoTo tiao
  9.             End If
  10.         Next
  11. tiao:
  12.     If x = 1 Then ar(i, 1) = k(j) Else ar(i, 1) = ""
  13.     x = ""
  14.     Next
  15.     [d2:d10] = ar
  16. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-8-9 01:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-8-25 13:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.png


=REGEXEXTRACT(A2,"[A-z]+\d+|$")

TA的精华主题

TA的得分主题

发表于 2024-8-25 13:51 | 显示全部楼层
正则练习。。。

extrat.zip

180 KB, 下载次数: 7

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

本版积分规则

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

GMT+8, 2024-11-18 16:39 , Processed in 0.040830 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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