ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 正则表达式入门与提高---VBA平台的正则学习参考资料

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-7-3 11:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:文本处理和正则
liu-aguang 发表于 2014-6-12 14:16
六、环视的多角度理解与应用        环视按引擎往前(右)看还是往后(左)看,分为顺序环视和逆序环视.VBscri ...

不重复单词的提取
\b(\w+)\b(?!.*?\b\1\b)
这个怎么理解好的呢?.不能匹配\n,"?!."不就是匹配\n么?
为什么\b(\w+)\b(.*?)(?!\b\1\b)不行?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-3 13:15 | 显示全部楼层
北木 发表于 2014-7-3 11:39
不重复单词的提取
\b(\w+)\b(?!.*?\b\1\b)
这个怎么理解好的呢?.不能匹配\n,"?!."不就是匹配\n么?
...

\b(\w+)\b(?!.*?\b\1\b)
每当\b(\w+)\b匹配到一个单词后,正则尝试(?!.*?\b\1\b),如果它报告失败,表明后面有相同单词出现,于是整个匹配失败;反之,表明后面没有相同单词出现,整个匹配成功.并将结果保存在匹配集合中.
.*?\b\1\b 子表达式是接着在前面单词后的位置上尝试有无\1,即前面相同单词.如果有,(?!...)部分报告失败,反之报告成功.
该正则表达式只能在同一行中查找,如果要跨行,可以把句点改为[\s\S]

你给出的正则对每一个单词来说都会成功,如将之作用于文本"abc abc",它的匹配过程是:
\b(\w+)\b成功匹配第一个abc,马上检查\b\1\b部分,由于第一个abc后是空格,所以不能与\1匹配,于是(?!...)报告成功,整个匹配完成.对其它位置上的单词匹配情况一样.注意(.*?)部分事实上不会匹配任何文本,因为?是忽略优先的,除非它后面的(?!...)部分报告失败,它才会开始匹配文本.
要理解上述解释,建议参考本文的原理部分.

TA的精华主题

TA的得分主题

发表于 2014-7-3 13:25 | 显示全部楼层
楼主能否给个在word中匹配空白段的正则式?
我的空白段是指如下例A、B行间的单纯空白段。功用要求有删除文本空白段时不能把A或B的回车删掉。
A:sahjidhsjaf回车

B:fsdkajfsdlgjlj回车


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-3 14:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wzsy2_mrf 发表于 2014-7-3 13:25
楼主能否给个在word中匹配空白段的正则式?
我的空白段是指如下例A、B行间的单纯空白段。功用要求有删除文 ...

正则不能直接作用于word等文本,只有作用它们的副本.关于你的要求,可以用word自身带的"查找与替换"功能:
查找内容: ^p^p
替换为:^p

TA的精华主题

TA的得分主题

发表于 2014-7-3 14:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-3 15:31 | 显示全部楼层
liu-aguang 发表于 2014-7-3 14:29
正则不能直接作用于word等文本,只有作用它们的副本.关于你的要求,可以用word自身带的"查找与替换"功能:
...

这个我当然知道,我要正则式则是准备在word vba 中使用。光用^p^p换^p会剩下很多,多次使用又感累赘。

TA的精华主题

TA的得分主题

发表于 2014-7-3 16:33 | 显示全部楼层
liu-aguang 发表于 2014-7-3 13:15
\b(\w+)\b(?!.*?\b\1\b)
每当\b(\w+)\b匹配到一个单词后,正则尝试(?!.*?\b\1\b),如果它报告失败,表明后 ...

明白了,(?!...),对于!后面的所有的字符是当一个整体来进行判断匹配的,
并且所要提取的是\b(\w+)\b,所以然我不应该那样的写,感谢楼耐心解释,
楼主大作,辛苦了,看了你帖子,收获好多!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-3 19:29 | 显示全部楼层
wzsy2_mrf 发表于 2014-7-3 15:31
这个我当然知道,我要正则式则是准备在word vba 中使用。光用^p^p换^p会剩下很多,多次使用又感累赘。

不能用^p^p和^p完全替换,说明有些空白行中存在不可见字符,如制表/空格等.如果要用正则,可考虑逐段读出,然后用正则判断,再结合word VBA语句去除那些行.正则表达式你可尝试: ^\s*\r\n?

TA的精华主题

TA的得分主题

发表于 2014-7-3 21:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-3 21:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liu-aguang 发表于 2014-7-3 19:29
不能用^p^p和^p完全替换,说明有些空白行中存在不可见字符,如制表/空格等.如果要用正则,可考虑逐段读出,然 ...

用下去代码去除空白段好象不行。初始正则,见笑。

Sub abc()
    Dim s$
    Selection.WholeStory
    s = Selection.Text
    Dim x&, m, n
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern = "^\s*\r\n?"
        Set m = .Execute(s)
        For Each n In m
            n = ""
        Next
    End With
    Selection.Text = s
End Sub

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

本版积分规则

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

GMT+8, 2024-12-26 03:44 , Processed in 0.041782 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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