ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

灵活应用,正则表达式截取字符串,怎么那么难?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-26 17:39 | 显示全部楼层 |阅读模式
本帖最后由 ning84 于 2017-3-27 06:50 编辑

学习正则表达式,已经好几年了,就是不能灵活应用。网友mzbao,用正则表达式,提取单元格的英文字母,
       =(1.38*(B13+(C13+2))^2+4*(B13+(C13+2))*E13)^0.5
       提取单元格的单元格(字母)后,
       重新生成公式:= "(1.38×(" & B6 & "+(" & C6 & "+2))^2+4×(" & B6 & "+(" & C6 & "+2))×" & E6 & ")^0.5"


因此,再学习excelhome中的精华帖。
Excel 正则表达式入门与提高-VBA平台的正则学习参考资料-ExcelVBA程序开发-ExcelHome技术论坛 -  http://club.excelhome.net/thread-1128647-1-1.html

1 正则提取字符串是不是就这两条语句。
     .Pattern = "(\$*[A-Z]+\$*\d+)"
    Set expRng = Reg.Execute(Str)
2 正则提取字符串,我认为能够应用的地方。

问:各位都在什么地方,使用正则。

*****************************************
网友mzbao,在这个帖子,用正则表达式,截取字符串。Excel 如何分离公式中的单元格元素?-ExcelVBA程序开发-ExcelHome技术论坛 -  http://club.excelhome.net/forum. ... 7&page=1#pid9039603
*******************************************


   Dim expRng, Arr, Txt
      With Reg
          .Global = True
          .Pattern = "(\$*[A-Z]+\$*\d+)"
      End With
      Stop
      Set expRng = Reg.Execute(Str)

现在主要理解
     .Pattern = "(\$*[A-Z]+\$*\d+)"
    Set expRng = Reg.Execute(Str)
********************************************




速记理解技巧编辑
.
[ ]
^
$
四个字符是所有语言都支持的正则表达式,所以这四个是基础的正则表达式。正则难理解因为里面有一个等价的概念,这个概念大大增加了理解难度,让很多初学者看起来会懵,如果把等价都恢复成原始写法,自己书写正则就超级简单了,就像说话一样去写你的正则了:

  等价:
等价是等同于的意思,表示同样的功能,用不同符号来书写。
?,*,+,\d,\w 都是等价字符
  ?等价于匹配长度{0,1}
  *等价于匹配长度{0,}
  +等价于匹配长度{1,}
  \d等价于[0-9]
\D等价于[^0-9]
  \w等价于[A-Za-z_0-9]
\W等价于[^A-Za-z_0-9]。
常用运算符与表达式:
  ^ 开始
  () 域段
  [] 包含,默认是一个字符长度
  [^] 不包含,默认是一个字符长度
  {n,m} 匹配长度
  . 任何单个字符(\. 字符点)
  | 或
  \ 转义
  $ 结尾
  [A-Z] 26个大写字母
  [a-z] 26个小写字母
  [0-9] 0至9数字
[A-Za-z0-9] 26个大写字母、26个小写字母和0至9数字
  , 分割
  .

  分割语法:
  [A,H,T,W] 包含A或H或T或W字母
  [a,h,t,w] 包含a或h或t或w字母
  [0,3,6,8] 包含0或3或6或8数字

  语法与释义:
  基础语法 "^([]{})([]{})([]{})$"
  正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"

  ?,*,+,\d,\w 这些都是简写的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
  初学者可以忽略?,*,+,\d,\w一些简写标示符,学会了基础使用再按表自己去等价替换


  实例:
  字符串;tel:086-0666-88810009999
  原始正则:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"
  速记理解:开始 "tel:普通文本"[0-9数字]{1至3位}"-普通文本"[0数字][0-9数字]{2至3位}"-普通文本"[0-9数字]{8至11位} 结束"
  等价简写后正则写法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,简写语法不是所有语言都支持。
替换技巧编辑
实例目录
【1】 正则表达式应用——替换指定内容到行尾
【2】 正则表达式应用——数字替换
【3】 正则表达式应用——删除每一行行尾的指定字符
【4】 正则表达式应用——替换带有半角括号的多行
【5】 正则表达式应用——删除空行
【6】 正则表达式应用——实例应用




评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-3-26 17:47 | 显示全部楼层
你要先学一下什么叫正则咯,否则,即使有人解释一遍,你看十遍都是一头汗水,哈哈

TA的精华主题

TA的得分主题

发表于 2017-3-26 18:56 来自手机 | 显示全部楼层
正则更是一门艺术,要像玩艺术一样玩正则。

TA的精华主题

TA的得分主题

发表于 2017-3-26 20:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-26 20:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没有觉得正则有多难
熟读唐诗三百首,不会作诗也会吟

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-27 07:29 | 显示全部楼层
本帖最后由 ning84 于 2017-3-27 08:15 编辑

Excel 正则表达式入门与提高-VBA平台的正则学习参考资料-ExcelVBA程序开发-ExcelHome技术论坛 -  http://club.excelhome.net/thread-1128647-1-1.html
现在理解这个帖子3楼的规则,不到位。






  1. Sub Test()
  2.     Dim RegX As New RegExp, S$, StrNew$                                '           1.定义变量代码段
  3.    
  4.     S = "正则表达式其实很简单     "                ' 2.目标文本字串变量赋值代码段
  5.     'Set regx=createobject(vbscript.regexp”)   3.创建正则对象代码段
  6.     RegX.Pattern = "\s+$"                       '              4.设置正则对象的pattern属性代码段
  7.     RegX.Global = True                          '                  5.设置正则对象的其它属性代码段
  8.     StrNew = RegX.Replace(S, "")              '             6.应用正则对象方法代码段
  9.     Debug.Print StrNew ' 7#; 处理返回值代码段
  10. End Sub

  11. Sub Test1()
  12.     Dim RegX As RegExp, S$
  13.     S = "Aaa" & vbLf & "bbb"   '这里用vblf 表示行之间的换行符
  14.     Debug.Print S
  15.     RegX.Pattern = "^|$"
  16.     RegX.Global = True
  17.     S = RegX.Replace(S, "@")
  18.     Debug.Print S
  19.     'MsgBox s
  20. End Sub
  21. Sub Text2()
  22.     Dim RegX As New RegExp, S
  23.     's = InputBox("请输入一个电子邮箱:")
  24.     S = "Xx@163.com"
  25.     RegX.Pattern = "^\S+@\S+$"
  26.     If RegX.Test(S) Then
  27.         MsgBox "你输入的电子邮箱格式正确:  " & S
  28.     Else
  29.         MsgBox "你输入的电子邮箱格式不正确!"
  30.     End If
  31. End Sub
  32. Sub Test3()
  33.     Dim RegX As New RegExp, S
  34.     S = "他们体重分别是:张三56,李四49,王五60。"
  35.     Debug.Print S
  36.     RegX.Pattern = "(\d+)"
  37.     RegX.Global = True
  38.     S = RegX.Replace(S, "$1KG")
  39.     Debug.Print S
  40. End Sub

  41. Sub Test4()
  42.     Dim RegX As New RegExp, k, Mh, strA$
  43.     strA = "苹果:iphone_5s;诺基亚:Nokia_1020"
  44.     'Set reg = CreateObject("vbscript.regexp")
  45.     RegX.Pattern = "\w+"
  46.     RegX.Global = True
  47.     Set Mh = RegX.Execute(strA)
  48.     For Each mhk In Mh
  49.         Debug.Print mhk.Value
  50.     Next
  51. End Sub
  52. ''
  53. Sub Test5()
  54.      Dim RegX As New RegExp, Mh, strA$, UserName$, DomName$
  55.      strA = "J3721@163.com"
  56.      
  57.      RegX.Pattern = "^(\w+)@(.+)$"
  58.      Set Mh = RegX.Execute(strA)
  59.      n = Mh(0).SubMatches.Count       'n值等于2
  60.      UserName = Mh(0).SubMatches(0)    'j3721
  61.      DomName = Mh(0).SubMatches(1)    '163.com
  62.      Debug.Print n, UserName, DomName
  63.      Stop
  64. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-27 08:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这段表述会提高理解。

本帖最后由 香川群子 于 2014-6-11 15:19 编辑

如果知道一点英文,理解记忆会更快。
\w
→ word 首字母 w
表示26个英文字符【A-Za-z】以及下划线【_】和数字【0-9】的集合,
.Pattern ="\w" 等价于 .Pattern ="[0-9a-z_A-Z]"

其中有英文字符很好理解,因为英语中的word肯定是由英文字母构成的。
另外,在VBA编程中,变量还可以含有数字和下划线,因此数字和下划线也被当做构成统一word的要素。

除此之外的其它字符,都不算构成word的要素了。


…………

\d
→ digit 首字母 d
表示数字【0-9】的集合,
.Pattern ="\d" 等价于 .Pattern ="[0-9]"


…………

\s
→ separate 首字母 s   或space、tab、return简称str字符的首字母。
表示分隔符号 含space 空格【 】或【char(32)】、回车vbCr【char(13)】、换行vbLf【char(10)】、vbTab【char(9)】等,
全部ASCII码值为: char(9)、char(10)、char(11)、char(12)、char(13)、char(32)(空格)

分隔符号的单独分开是\t   tab 首字母  vbTab【chr(9)】或 其反集 \T  

\v   verticaltab 首字母  vbVerticalTab【chr(11)】或 其反集 \V  

\f   formfeed 首字母  vbFormFeed【chr(12)】或 其反集 \F

\r   回车 return 首字母 r 而在VBA中对应的是:vbCr【chr(13)】或 其反集 \R   (Cr是Carriage Return的简称,是机械式打字机时代,字车carriage回复return 到最左边开始的意思 )
     苹果机(MAC OS系统) 采用回车符Cr 表示下一行.

\n   换行 newline 首字母n  vbLf【chr(10)】或 其反集 \N
   (Lf是Line Feed的简称,是机械式打字机时代,回车的同时自动滚进一行的意思 )
     UNIX/Linux系统采用 换行符Lf 表示下一行.

\r\n 回车换行  vbCrLf【chr(13) & chr(10)】
     Dos和windows系统 采用 回车+换行CrLf 表示下一行,


=================

接下来介绍,对上述几个常用元序列/集合,使用小写字母时是有效,含有的意思,
而使用大写字母时是无效,排除(不含有)的意思,

如:

\W → word 首字母 大写 W 标记的【英文字母、数字、下划线】的序列/集合的反集

小写字母w .Pattern ="\w" 等价于 .Pattern ="[0-9a-z_A-Z]"

大写字母W .Pattern ="\W" 等价于 .Pattern ="[^0-9a-z_A-Z]"


2.

\D → digit 首字母 大写 D 标记的【数字】的序列/集合的反集

小写字母d .Pattern ="\d" 等价于 .Pattern ="[0-9]"

大写字母D .Pattern ="\D" 等价于 .Pattern ="[^0-9]"


3.

\S → separate 首字母 大写 S 标记的不可见换行字符的序列/集合的反集

小写字母s .Pattern ="\s" 等价于 含有char 9,10,11,12,13,32

大写字母S .Pattern ="\S" 等价于 不含有char 9,10,11,12,13,32

*************************

本帖最后由 香川群子 于 2014-6-11 11:33 编辑


\b 和 \B

begin 的首字母 b

意义: 以上述\s separate 集合分隔后得到的每一个 \w word 中的第1个begin字符。

如:
abe sau
dty12 f_34

执行小写字母b .Pattern ="\b." 则得到每一个word的首字母:a s d f

=====

执行大写字母B .Pattern ="\B." 则得到每一个word的首字母以外的字符:b e a u t y 1 2 _ 3 4


====
以上。

补充,该规则仅对英文word能100%正确作用。
如果对象字符集中出现\W字符即非英文数字下划线字符,如汉字或其他符号,
则可能会返回不可预知的结果。(因为汉字等其它词汇无法像英文那样简单区分word和word之间的间隔。)
(如同Vlookup函数中搜寻数组中没有正确A-Z排序时可能返回不可预知结果一样。)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 08:44 , Processed in 0.041268 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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