ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 提取符合特定规则的文本,我用“万能正则表达式”!

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-17 10:49 | 显示全部楼层
第一节:“万能正则表达式”的一般写法和概述

1.1 “万能正则表达式”的一般写法

“万能正则表达式”的一般写法是:
[\s\S]*?(eXp)|[\s\S]+

其中的eXp,是指匹配于目标中特定规律的字符的正则表达式,它是一个变量。
“万能正则表达式”中,以统一的模式,纳入一个变量,从而实现以不变应万变,成为用Replace方法提取匹配于表达式eXp的字符串的“万能”之方法!


1.2 “万能正则表达式”概述

首先,本文中所称“万能正则表达式”,都是指使用正则表达式对象的Replace方法时所用到表达式。

对于正则表达式对象,初有认识者,往往认为正则表达式对象的Replace方法不如其Execute方法灵活。而我的理解恰恰相反。

正则表达式的Execute方法是该对象的功能基础。凡是用Replace方法所能实现的功能,用Execute方法都可以灵活编程实现。这个说法一点儿都没错。


但是,就此否定Replace方法的强大,则谬之大矣!

实事上,正则表达式对象的Replace方法更是对其Execute方法的集成利用。
所谓“青出于蓝而胜于蓝”,如果Replace方法没有胜过Execute方法之处,那么,Replace方法也就没有存在的必要了。

对正则表达式已经有初步知识的读者都知道以下两点基本知识:

①正则表达式的Execute方法,可以得到【匹配于表达式“eXp”的字符串】以及其中所捕获分组的内容。
②正则表达式的Replace方法,可以把【匹配于“eXp”的字符串】替换成另一个字符串【ReplaceString】。



有人就会问了:既然说Replace方法能胜过Execute方法,那至少要让Replace方法能做到Execute方法所能做到的所有事情吧?

我的回答是:当然能够!

因为,我有——万能正则表达式!

换句话说,“万能正则表达式”,让正则表达式的Replace方法,可以做到Execute方法所能做到的所有事情!

TA的精华主题

TA的得分主题

发表于 2018-8-17 11:07 | 显示全部楼层
只是 正则 的 捕获性分组 而矣,$1
  1. .*?( ).*
复制代码


写的那么玄乎

TA的精华主题

TA的得分主题

发表于 2018-8-17 15:44 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-8-17 15:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
支持一下。。。。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-17 16:33 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-8-17 17:35 编辑

第二节:“万能正则表达式”的简略写法

前面已经讲过,“万能正则表达式”的一般写法是: [\s\S]*?(eXp)|[\s\S]+

其中,“[\s\S]”表示包含换行符和回车符在内的任意字符。

而在EXCEL的数据中,通常单元格中的字符不会包含换行符和回车符,这时,[\s\S]就可以用“.”替代,从而得到“万能正则表达式”的简略写法:

.*?(eXp)|.+


这时的“万能正则表达式”,尤如不施“粉黛”的世家贵妇,虽然外观简朴,但丰富的内涵气质更加显露。

如果把变量eXp不计算在内,其短短的8个字符,把正则表达式对象的所有运算都可概括在内:
其中,有5个不同的表达式运算法则:
①非贪婪匹配运算*?
②分组运算()
③贪婪匹配运算+
④非贪婪匹配表达式.*?与分组表达式之间的顺序“逻辑与”运算。
⑤第④步形成的整体与贪婪匹配表达式.+之间的顺序“逻辑或”运算

注意,第④项、第⑤项的逻辑运算都是有顺序关系的,要想准确的理解,可以用IF函数来模拟,即
第④项相当于: If .*?  then If () then ……
第⑤项相当于: If .*?() Then …… ElseIf .+ Then ……

重点要说的是,其中的分组运算符“()”更是正则表达式的精髓,因为其中可以多层嵌套正则表达式对象的所有运算规则,这种嵌套,给正则表达式对象的运算能力带来了理论上的“无穷”扩展(虽然实际上,正则表达式的分组运算与Excel公式中的括号运算嵌套一样是有层数限制的),把变量eXp置入其中,从而使之有了“万能”之力。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-17 18:55 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-8-17 20:16 编辑

第三节:“万能正则表达式”的特例

从本贴5楼的动图演示中可以看出,用万能表达式[\s\S]*?(eXp)|[\s\S]+,可以一次就完成提取目标字符串中匹配于表达式eXp的所有项,但是,如果要求只提取其中的一项或某几项,又如何编写呢?

下面,就列举“万能正则表达式”的几种特例,或者叫“万能正则表达式”的几种变形公式

1、提取匹配表达式eXp的第一项
^[\s\S]*?(eXp)|[\s\S]+

2、提取匹配表达式eXp的最后一项
[\s\S]*(eXp)[\s\S]*?$|[\s\S]+

3、提取匹配表达式eXp的第X项(X>0)
(?:[\s\S]*?eXp){X-1}[\s\S]*?(eXp)|[\s\S]+

4、提取匹配表达式eXp的第X至第Y项(Y>X>0)

当Y-X<8时,可以用一个步骤提取出来

否则,则可能需要两个步骤完成。

下面以X=3、Y=5举例(假设eXp不会匹配到空格):
查找:

(?:[\s\S]*?eXp){2}[\s\S]*?(eXp)[\s\S]*?(eXp)[\s\S]*?(eXp)|[\s\S]+

替换为:

"$1 $2 $3"

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-17 19:34 来自手机 | 显示全部楼层
本帖最后由 duquancai 于 2018-8-17 19:52 编辑

看了楼主的 “万能”,我才知道我学的 正则 ......我我我感慨我自己门都没入!

TA的精华主题

TA的得分主题

发表于 2018-8-17 21:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”,用数字2替换,想得到结果"qwe100eh122222345exxe67822999eexc"。给个你的万能公式学习下

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-17 21:46 | 显示全部楼层
fsq119 发表于 2018-8-17 21:16
字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”,用数字2替换,想得到结 ...

你的描述就自相矛盾!

字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”,用数字2替换,

其中的唯一的一处“eee”,就正好处于数字1和2之间,那么,它应该被替换成单个“2”。

显然,你的“答案”与你之前的描述是不符合的!或者说你的“标准答案”就是错的!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-17 22:08 | 显示全部楼层
fsq119 发表于 2018-8-17 21:16
字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”,用数字2替换,想得到结 ...

不要去看什么举例,只从定义上看:
单个e或连续的e,就是e+或者按最原始的记法为e{1,}

而要求它们是处于数字之间,由于vbs正则对象不支持所谓的(?<=exp),则只能用捕获分组来解决:
(\d)e+(?=\d)
替换为$12
$12中的$1与前面的捕获分组(\d)对应以保持不变,仅把e+替换成"2"

最终的正确结果,你可以自己试一试!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 19:21 , Processed in 0.029825 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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