ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-17 22:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fsq119 发表于 2018-8-17 21:16
字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”,用数字2替换,想得到结 ...

我没有万能的,我只有这样写代码》》》》》
  1. Sub main()
  2.     Dim js As Object, s$
  3.     Set js = CreateObject("MSScriptControl.ScriptControl")
  4.     js.Language = "JavaScript"
  5.     s = "qwe100eh1eee2e345exxe678ee999eexc"
  6.     MsgBox js.eval("'" & s & "'.replace(/(\d)(e+)(?=\d)/g,function(s,b,c){k='';if(s)for(i=0;i<c.length;i++){k+='2';};return b+k;});")
  7. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-8-18 02:43 | 显示全部楼层
做为该论坛的一名粉丝,一名业余的不能再业余的爱好者,我对Excel所有认知几乎都来源于此。这里没有歧视,少有商业化,是个能帮助学习、解惑的好地方,甚至它连帖子都要审核后才能发上来,我都觉得不应该,别把少有的干净地方也弄脏了!
言归正传,上面的举例表述应该没有太大的问题,无非就是连续的e,每一个e也都做替换,何况还有结果示例,实际上这个例题有人曾问过。来你这贴是想学学你的方法而已,无他。出于喜欢和好奇想看看楼主的公式,从而一窥一二。
我是用的笨方法,把复杂的分解:
  1. Public Sub xx2()
  2. s = "qwe100eh1eee2e345exxe678ee999eexc"
  3. With CreateObject("vbscript.regexp")
  4. .Global = False
  5. .Pattern = "\d+e+(?=\d)"
  6. Do While .test(s)
  7.     Set mas = .Execute(s)
  8.     .Pattern = "e"
  9.     s1 = .Replace(mas(0), "2")
  10.     .Pattern = "\d+e+(?=\d)"
  11.     s = .Replace(s, s1)
  12. Loop
  13. End With
  14. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-18 09:59 | 显示全部楼层
18楼的 描述简练且明确,也有模拟结果!没啥毛病。
我也很期待“万能的正则”!
针对18楼的 实例 我扩展一下需求:

字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”的前提下对每一个e(标记颜色的e)用数字“升序”替换,想得到“对应”结果"qwe100eh112324345exxe67856999eexc"(替换后标记颜色的数字组合在一起就是123456......)。同样期待“万能的正则表达式”!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-18 10:34 | 显示全部楼层

有必要声明一下:

凡是在 本贴正贴部分
1)、本人所称的使用正则表达式的Replace方法得到想要的内容,默认都是只对源字符串仅执行一次正则替换,而直接到得的结果(即:不把正则替换的结果做再次加工;即使在有特别说明时也只允许执行 “有限多次”的正则替换,不允许执行“不定多次”的正则替换。
比如,我在此前的16楼中的特例4中,就特别指出:当Y-X>8时,可能需要2次执行正则替换,才能提取到源字符串中匹配于正则表达式eXp的各部分字符串中的 第X项至第Y项。
2)、正贴部分,所列出的正则表达式,要求适应于以下自定义的 通用型 正则替代函数
Public Function REGREPLACE(ByVal text1$, ByVal pttn$, Optional ByVal strReplacer$ = " ")
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern = pttn
        REGREPLACE = .Replace(text1, strReplacer)
    End With
End Function

至于 本贴讨论部分的各楼层中,为活跃论坛气氛,可以不受上述声明限制。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-18 11:04 | 显示全部楼层
在VBA中创建VBS正则对象
同样 可以创建 JS 对象!
然而  JS 对象 中的replace方法 的第一参数可以支持正则表达式,更为重要的是第二参数可以 支持 回调函数,这个回调函数使得JS中的replace方法强大了不少!!!
至于万能的正则表达式,我一直在找,看到此贴,我终于找到了:万能正则表达式!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-18 11:11 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-8-18 12:02 编辑

声明:本楼层的内容 属于 讨论部分

楼上两位的热情参与讨论,虽然有点打乱了我的正贴部分的节奏,但是本主题的主要概念和正文内容,都已经贴出来了,剩下未贴出的也只是实例演示,所以对于两位提前进入讨论环节,也还是欢迎之至。

我尝试 用24楼给出 的自定义的 通用型 正则替换 函数,做出fsq119网友想要的结果(在本讨论楼层中,请允许我使用了Excel VBA的evaluate函数,对 正则替换的直接结果 进行了二次加工)。

  1. '使用正则替换方法编写的通用型自定义函数
  2. Public Function REGREPLACE(ByVal text1$, ByVal pttn$, Optional ByVal strReplacer$ = " ")
  3.     With CreateObject("vbscript.regexp")
  4.         .Global = True
  5.         .Pattern = pttn
  6.         REGREPLACE = .Replace(text1, strReplacer)
  7.     End With
  8. End Function
复制代码


'答fsq119网友18楼讨论提问:
'字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”的每一个“e”红字部分,是按照 fsq119在22楼中做出的补充说明:“每一个e也都做替换),
'用数字2替换,想得到结果"qwe100eh122222345exxe67822999eexc"。

Sub test0()
    s = "qwe100eh1eee2e345exxe678ee999eexc"
    MsgBox Evaluate("""" & REGREPLACE(s, "(\d)(e+)(?=\d)", "$1"" & rept(2,len(""$2"")) & """) & """")
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-18 11:35 | 显示全部楼层
说到使用 正则表达式对象的替换方法,有意义的一般都是指:仅执行正则替换方法 1次或有限的几次,而直接得到预期结果。

否则,如果允许在执行“正则对象的替换方法”的 过程之中 或 过程之后,执行额外的代码运算,那就失去讨论的意义了。因为那样,你可以把任意字符串 经过 特定的代码运算,而得到fsq119网友在18楼所预期的结果。如果执行无穷多次 js或vbs的eval 或者VBA的Evaluate函数,有什么不 “万能”的?!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-18 11:44 | 显示全部楼层

看来,我也应当学习一点js,至少我就可以秀一下万能的伊娃儿了!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-18 11:56 | 显示全部楼层
嗯,如果我学了js之后,一定要新开一个贴子,就按本主题的样式简单改一下,就叫“提取符合特定规则的文本,我用‘万能的伊娃儿’!” 相信一令能博取无数眼球!或者,无数的臭鸡蛋……

TA的精华主题

TA的得分主题

发表于 2018-8-18 12:04 | 显示全部楼层
18楼的 描述简练且明确,也有模拟结果!没啥毛病。
我也很期待“万能的正则”!
针对18楼的 实例 我扩展一下需求:

字串"qwe100eh1eee2e345exxe678ee999eexc",要求数字之间所夹的单个或连续的“e”的前提下(标记颜色的e)有1个e就替换成“1e”,有2个e就替换成“2e”......,想得到“对应”结果为:"qwe100eh13e21e345exxe6782e999eexc"。同样期待“万能的正则表达式”!
结果字符串“qwe100eh13e21e345exxe6782e999eexc”
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 19:43 , Processed in 0.043926 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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