ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 正则分离 "22:40*~3 站/10 千米",米和千米要2个Pattern

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-10-13 15:26 | 显示全部楼层 |阅读模式
本帖最后由 ning84 于 2024-10-15 14:20 编辑
  1. Sub lll()
  2.     Dim Str
  3.         Str = "22:40*~3 站/10 千米"
  4.     Dim Matches As MatchCollection
  5.     Dim TimePattern As New RegExp
  6.     Dim StationPattern As New RegExp
  7.     Dim DistancePattern As New RegExp
  8.         'TimePattern.Pattern = "(\d{2}:\d{2})\*"
  9.         TimePattern.Pattern = "\d{2}:\d{2}"
  10.         Set Matches = TimePattern.Execute(Str)
  11.         Debug.Print Matches.Item(0)
  12.         
  13.         Stop
  14.         TimePattern.Pattern = "\d+ 站"
  15.         Set Matches = TimePattern.Execute(Str)
  16.         Debug.Print Matches.Item(0)
  17.         Stop
  18.         
  19.         DistancePattern.Pattern = "\d+ 千米"
  20.         Set Matches = DistancePattern.Execute(Str)
  21.         Debug.Print Matches.Item(0)
  22.    
  23.     Stop
  24.    
  25. End Sub
复制代码



        Str = "22:40*~3 站/10 千米"

用      DistancePattern.Pattern = "\d+ 千米"      
        Set Matches = DistancePattern.Execute(Str)
        结果 10 千米

        Str = "22:40*~3 站/10 千米"
        改
        Str = "22:40*~3 站/10 米"



      DistancePattern.Pattern = "\d+ 米"      
        Set Matches = DistancePattern.Execute(Str)
        结果才能使 10 米

   
    Stop
   
End Sub



补充相关知识

[color=var(--color-neutral-100,#000)][color=var(--color-text-primary)][color=var(--md-box-samantha-normal-text-color) !important]正则表达式的基本语法规则如下:

[color=var(--md-box-samantha-normal-text-color) !important]一、字符匹配

  • 普通字符:直接匹配自身,例如 “a” 匹配字符 “a”。
  • 特殊字符:如 “.” 可以匹配除换行符以外的任意单个字符;“\d” 匹配一个数字字符;“\w” 匹配一个单词字符(包括字母、数字和下划线)等。

[color=var(--md-box-samantha-normal-text-color) !important]二、字符重复

  • “[color=var(--md-box-samantha-deep-text-color) !important]”:表示前面的字符可以出现零次或多次。例如 “a” 可以匹配 “”(空字符串)、“a”“aa”“aaa” 等。
  • “+”:表示前面的字符可以出现一次或多次。例如 “a+” 可以匹配 “a”“aa”“aaa” 等,但不能匹配空字符串。
  • “?”:表示前面的字符可以出现零次或一次。例如 “a?” 可以匹配 “”(空字符串)或 “a”。
  • “{n}”:表示前面的字符恰好出现 n 次。例如 “a {3}” 匹配 “aaa”。
  • “{n,}”:表示前面的字符至少出现 n 次。例如 “a {2,}” 匹配 “aa”“aaa”“aaaa” 等。
  • “{n,m}”:表示前面的字符出现 n 到 m 次。例如 “a {2,4}” 匹配 “aa”“aaa”“aaaa”。

[color=var(--md-box-samantha-normal-text-color) !important]三、字符集合

  • “[abc]”:匹配字符 “a”“b” 或 “c” 中的任意一个。
  • “[^abc]”:匹配除了 “a”“b”“c” 之外的任意一个字符。
  • “[a-z]”:匹配小写字母 a 到 z 中的任意一个字符。
  • “[A-Z]”:匹配大写字母 A 到 Z 中的任意一个字符。
  • “[0-9]”:匹配数字 0 到 9 中的任意一个字符。

[color=var(--md-box-samantha-normal-text-color) !important]四、分组和捕获

  • “()”:用于分组,可以将多个字符或表达式组合在一起。同时,括号内的内容可以被捕获,以便在后续的处理中使用。
  • “\1”“\2” 等:用于引用捕获的分组。例如,“(a) b\1” 可以匹配 “ab” 后面跟着与第一个分组(这里是 “a”)相同的字符。

[color=var(--md-box-samantha-normal-text-color) !important]五、锚点

  • “^”:表示匹配行的开头。例如 “^abc” 匹配以 “abc” 开头的行。
  • :表示匹配行的结尾。例如” 匹配以 “abc” 结尾的行。

[color=var(--md-box-samantha-normal-text-color) !important]六、转义字符

  • 如果要匹配特殊字符本身,需要使用转义字符 “\”。例如 “.” 匹配字符 “.”;“*” 匹配字符 “*”。



[color=var(--s-color-text-secondary,rgba(0,0,0,.8))][color=var(--s-color-text-secondary,rgba(0,0,0,.7))]正则表达式的应用场景有哪些?
[color=var(--s-color-text-secondary,rgba(0,0,0,.8))][color=var(--s-color-text-secondary,rgba(0,0,0,.7))]正则表达式的优势是什么?
[color=var(--s-color-text-secondary,rgba(0,0,0,.8))][color=var(--s-color-text-secondary,rgba(0,0,0,.7))]如何学习正则表达式?

[backcolor=rgba(255, 255, 255, 0.8)][backcolor=var(--s-color-bg-primary)]








TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-13 15:42 | 显示全部楼层
本帖最后由 ning84 于 2024-10-13 17:15 编辑

正则表达式——全部符号解释(详解)_正则匹配所有字符意思-CSDN博客  https://blog.csdn.net/weixin_42167759/article/details/80403578
现在用的是"|"解决---"\d+ 米|\d+ 千米"



Sub lll()
    Dim Str
        Str = "22:40*~3 站/10 千米"
        Str = "22:40*~3 站/101 米"
    Dim Matches As MatchCollection
    Dim TimePattern As New RegExp
    Dim StationPattern As New RegExp
    Dim DistancePattern As New RegExp
        'TimePattern.Pattern = "(\d{2}:\d{2})\*"
        TimePattern.Pattern = "\d{2}:\d{2}"
        Set Matches = TimePattern.Execute(Str)
        Debug.Print Matches.Item(0)
        
        Stop
        TimePattern.Pattern = "\d+ 站"
        Set Matches = TimePattern.Execute(Str)
        Debug.Print Matches.Item(0)
        Stop
        
        DistancePattern.Pattern = "\d+ 米|\d+ 千米"
        Set Matches = DistancePattern.Execute(Str)
        Debug.Print Matches.Item(0)
   
    Stop
   
End Sub

     



数据源

image.png
















B1.zip

30.36 KB, 下载次数: 3

B1.zip

17.15 KB, 下载次数: 3

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-13 19:53 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
import re

# 输入字符串
input_string = "16:43* 2站/2.8千米"

# 正则表达式
pattern = r'(\d{2}:\d{2})\*\s*(\d+)站\/(\d+\.\d+)千米'

# 进行匹配
match = re.match(pattern, input_string)

if match:
    time = match.group(1)
    stations = match.group(2)
    distance = match.group(3)
    print(f"时间: {time}")
    print(f"站点数: {stations}")
    print(f"距离: {distance}千米")
else:
    print("未匹配到任何内容")

TA的精华主题

TA的得分主题

发表于 2024-10-14 09:22 | 显示全部楼层
ning84 发表于 2024-10-13 15:42
正则表达式——全部符号解释(详解)_正则匹配所有字符意思-CSDN博客  https://blog.csdn.net/weixin_42167 ...

=REGEXP(C3:C4,"\d+\ 米|\d+\ 千米")
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-15 17:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习学习,再学习。

  1. Function RegTimeKm(Rng As Range)
  2.    Dim Str
  3.        Str = Rng(, 2)
  4.    Dim Arr(2)
  5.    Dim MatColl As MatchCollection
  6.    Dim TimeReg As New RegExp
  7.        TimeReg.Pattern = "\d{2}:\d{2}"
  8.        Set MatColl = TimeReg.Execute(Str)
  9.        Arr(0) = MatColl.Item(0)
  10.    Dim KmReg As New RegExp
  11.    Dim oVal As Validation
  12.        KmReg.Pattern = "\d+\.\d+米|\d+\.\d+千米|\d+千米|\d+米"

  13.        Set MatColl = KmReg.Execute(Replace(Str, " ", ""))
  14.        'Stop
  15.        Str = MatColl.Item(0)
  16.       
  17.        Arr(1) = MatColl.Item(0)
  18.        RegTimeKm = Arr
  19.     Dim Reg As New RegExp
  20.         Str = Rng(, 1)
  21.         
  22.         Reg.Pattern = "^\d?s千米"
  23.         Reg.Pattern = "\D+"
  24.        Set MatColl = Reg.Execute(Replace(Str, " ", ""))
  25.        'Stop
  26.        Str = MatColl.Item(0)
  27.        Arr(2) = Str
  28.        RegTimeKm = Arr
  29.       
  30. End Function
  31. Sub ll()
  32.    Dim oDate As Date, oDate1 As Date
  33.    Dim Rng As Range, Arr, Bus
  34.       With Sheets("Tmp")
  35.          Set Rng = .Cells(5, 1).CurrentRegion
  36.          oDate1 = .Cells(1, 1)
  37.          Bus = .Cells(1, 2)
  38.       
  39.       End With
  40.    Dim K9Road
  41.    
  42.        K9Road = K9RoadArr
  43.       
  44.    Dim Sht As Worksheet
  45.        Set Sht = Sheets("K9")
  46.       
  47.        With Sht
  48.             .Activate
  49.             .Cells.Clear
  50.             .Cells.Font.Size = 9
  51.        End With
  52.    Dim ii, Cc, Rr
  53.        Rr = 10
  54.        Cc = 5
  55.       For ii = 1 To Rng.Rows.Count
  56.            Arr = RegTimeKm(Rng(ii, 1))
  57.            With Sht
  58.                
  59.                .Cells(Rr + ii, Cc) = Arr(2)
  60.                .Cells(Rr + ii, Cc + 1) = K9Road(1)(Rng.Rows.Count - ii + 0)
  61.                .Cells(Rr + ii, Cc + 2) = Format(oDate1, "yyyy年mm月dd日") & " " & Arr(0)
  62.                .Cells(Rr + ii, Cc + 3) = Arr(0)
  63.                .Cells(Rr + ii, Cc + 4) = Arr(1)
  64.                ''
  65.                .Cells(Rr + ii, 1) = ii
  66.                .Cells(Rr + ii, 2) = Bus & "," & Format(oDate1, "yyyy年mm月dd日") & Arr(0) & "行驶到" & K9Road(1)(Rng.Rows.Count - ii + 0) & "--" & Arr(2) & "的公交站"
  67.                
  68.                
  69.                
  70.            End With
  71.       Next ii
  72. End Sub

复制代码

  1. Function K9RoadArr()
  2.   Dim StationArr, RoadArr
  3.       StationArr = Array("香洲", "南坑", "南香里", "香宁花园", "柠溪", "隧道南", "兰埔(富华里)", "白石(银石雅园)", "华发新城", "翠湾", "湖心路口", "保利香槟", "时代山湖海", "二号闸", "金湾高尔夫", "青湾", "东咀", "金岛路东", "金都大厦", "金海岸中学", "金沙湾豪庭", "斜尾", "城建总公司", "鱼弄", "中南修理厂", "月堂", "唐人街", "映月新村", "三灶车场")
  4.       RoadArr = Array("紫荆路", "紫荆路", "柠溪路", "柠溪路", "柠溪路", "迎宾南路", "九洲大道西(S366)", "九洲大道西(S366)", "九洲大道西(S366)", "九洲大道西(S366)", "九洲大道西(S366)", "金湾路(S272)", "金湾路(S272)", "金湾路(S272)", "金湾路(S272)", "金湾路(S272)", "金岛路", "金岛路", "金岛路", "金岛路", "金岛路", "金岛路", "金海岸大道东", "金海岸大道东", "金海岸大道西", "金海岸大道西", "伟民路", "映月路", "琴石路")
  5.   Dim Arr(1)
  6.       Arr(0) = StationArr
  7.       Arr(1) = RoadArr
  8.       K9RoadArr = Arr
  9. End Function
复制代码


TA的精华主题

TA的得分主题

发表于 2024-10-16 18:27 | 显示全部楼层
“复杂世界里,一个就够了”
.Pattern = "\d*\.?\d+千?米"
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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