ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 正则表达式的字符组,新手必踩的几个坑,你必须知道

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-24 16:18 | 显示全部楼层 |阅读模式






[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)



什么是字符组

在同一个位置可能会出现不同的字符,我们将这些可能出现的字符放在一起,用中括号括起来,这就是字符组。

比如从字符串“Excel makes you excel!”中的提取“excel”,不区分大小写,也就是不管是Excel、还是excel都可以。

那么,在xcel之前有可能是e,也有可能是E。在不使用(?i)忽略大小写模式的情况下,我们就要将可能出现的E和e都列出,用中括号括起来,[Ee],这就是字符组。


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

另外,为了表示连续的字符,比如:

1、阿拉伯数字,我们不太可能写为:

[0123456789]

2、字母,更不可能写为:

[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]

为简洁起写,我们按日常习惯的写法:

[0-9]

表示从0-9

[a-zA-z]

表示从a到z的所有小写字母以及从A到Z的所有大写字母

说明:不能写成[A-z],更不写为[a-Z]

原因:

  • 在unicode字符中a比Z大,不能写为[a-Z]
  • 在大写Z与小写a之间,还有左右中括号、左斜杠、脱字符、下划线、重音符(反引号),写为[A-z]是不精确的。


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

字符组看起来挺简单的啊,会有什么坑呢?

有一些坑,对初学者来讲,比较隐蔽,可能入了坑还不知道,现在都没出来。

我为什么这么清楚?

因为,这些坑我都踩过。





[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




字符组的小世界

在正则表达式的字符天地里,字符组[]犹如一个独立王国,有它的不同规则,它构建了一个相对独立而"奇葩"的规则小世界。在这里,部分字符,我身非我,它们被赋予了新的作用。

佛曰:“一花一世界,一树一菩提”,正是字符组的生动写照。




下面我们一一阐述。





[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)



众生平等是基本原则

我们知道,在正则表达式中,字符是有先后之分的,比如字符串“Excel”在正则表达式看来,就是首先是E,后面跟着x,再就是c……l排在最后。被匹配时,也是按这个顺序逐一去匹配。

但在字符组的内部,所有的字符都遵循着平等的原则。它们没有先来后到之分,不论资排辈,每个字符都有机会被选中。这就像是在一个没有等级之分的乌托邦社会,每个字符都有机会展现自己。

比如开篇所举的案例,字符组[Ee]中的E和e是平等的,并不是E被选了,e就不能被选了。

众生平等是字符组的基本原则 。





[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)



特权字符无特权

我们知道,在字符组外面,那些元字符(特权字符),比如:问号`?`、竖杠`|`和句号`.`都是拥有特殊能力的特权人物。

但一旦它们进入字符组的世界,它们就会失去所有的特权,变得和普通字符一样。

比如那个牛逼哄哄,可以代表整个世界的"."(可代表除换行符之外的所有字符),人小权力大,整个世界都被它代表了,简单是牛13plus pro max extra。


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




但是一旦进到字符组,它就乖乖地只代表他自己。


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




其他的问号、星号小括号、大括号等,也是一样,在字符组内部只是普通字符。

也许,在字符组内部时,它们会象被贬黄州的苏轼一样自嘲:本字符上可陪玉皇大帝,下可陪卑田院乞儿。




TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-24 16:18 | 显示全部楼层




[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)



一身反骨,高呼“王侯将相宁有种乎”的脱字符

在元字符中有一个字符,比较特别,它就是脱字符^。

在之前的写的《5句话,让你的正则表达式水平突飞猛进!(第1-2句)》、《5句话,让你的正则表达式水平突飞猛进!(第3-5句)》文章,我们介绍过:脱字符^可用来定位字符串的开始位置。

看起来普普通通的它,放到字符组中,似乎也很安静,静静地只做自己。

=REGEXP(B1,"[符字脱^]+")


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

但是你不能将它放到“领导”位置【字符组的开始处】,一坐到“领导”位置,它就开始造反,高呼“王侯将相宁有种乎”,然后带领字符组内部的所有成员脱离组织。

比如:

公式1

=REGEXP(B1,"[^符字脱]+")

它会将“脱”“字”“符”三个字带离队伍


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




公式2:

=TRANSPOSE(REGEXP(B1,"[^Excel偷懒的技术]+"))


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)







[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)



混在队伍中间就爆发超能力的连字符-

还有一个字符比较特别,那就是连字符。

连字符它在字符组的开始和结尾,它只是它。

公式:

=REGEXP(B1,"[-ex]+")


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

但与一身反骨的脱字符不同,它一进到字符组内,并且在“人民群众”中间时,就会小宇宙爆发,将左右字符连成一片,代表从左边字符到右边字符的一群字符。

公式:

=REGEXP(B1,"[e-x]+")


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

代表了从左边字符e到右边字符x中间的所有字符。也就是:

efghijklmnopqrstuvwx

【敲黑板】注意,注意:

如果写成

=REGEXP(B1,"[x-e]+")

会出错的,因为x比e大,小的要放前面。


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)









TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-24 16:19 | 显示全部楼层




[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)



发挥稳定的转义符\(左斜杠)

转义符\是一个发挥稳定的大师,性能的稳定性快赶上中国男足了(中国男足一直稳定发挥,给足球评论员解说的机会从来都是“留中国队的时间不多了”)。

转义符在字符组外部,它都能够让特定字符发挥或失去特殊作用。在字符组中,它的魔力依旧不变,能够指定字符的特殊含义。

比如在字符组内\S还是表示非空白字符


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)




在字符组内\d还是代表数字


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

扩展:

表示所有字符的正则表达式:

[\s\S]:匹配所有空白字符和非空白字符。

[\w\W]:匹配所有单词字符和非单词字符。

[\d\D]:匹配所有数字字符和非数字字符。


[backcolor=rgba(0, 0, 0, 0.1)]
[backcolor=rgba(0, 0, 0, 0.1)]






添加图片注释,不超过 140 字(可选)

最后,留一个思考题:

英文句号“.”代表除换行符之外的所有字符,\n代表换行符。那么

[.\n]

能不能代表所有字符?为什么?

欢迎在评论区留下你的答案。

上面这些小知识点,都是坑,一不小心就踩坑了。本文通俗易懂,看了本文,你就不会掉坑了。



欢迎阅读龙逸凡发表在Excel偷懒的技术公众号的其他正则表达式入门文章:


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-11-7 13:51 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
最近刚好接触正则,学习了

TA的精华主题

TA的得分主题

发表于 2024-11-13 19:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-12-1 23:05 | 显示全部楼层
[.\n],不能代表所有字符,因为在字符组中失去了特权。

TA的精华主题

TA的得分主题

发表于 2024-12-2 08:43 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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