正则表达式的字符组,新手必踩的几个坑,你必须知道
创作者俱乐部成员
添加图片注释,不超过 140 字(可选)
什么是字符组
在同一个位置可能会出现不同的字符,我们将这些可能出现的字符放在一起,用中括号括起来,这就是字符组。
比如从字符串“Excel makes you excel!”中的提取“excel”,不区分大小写,也就是不管是Excel、还是excel都可以。
那么,在xcel之前有可能是e,也有可能是E。在不使用(?i)忽略大小写模式的情况下,我们就要将可能出现的E和e都列出,用中括号括起来,[Ee],这就是字符组。
添加图片注释,不超过 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]是不精确的。
添加图片注释,不超过 140 字(可选)
字符组看起来挺简单的啊,会有什么坑呢?
有一些坑,对初学者来讲,比较隐蔽,可能入了坑还不知道,现在都没出来。
我为什么这么清楚?
因为,这些坑我都踩过。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
字符组的小世界
在正则表达式的字符天地里,字符组[]犹如一个独立王国,有它的不同规则,它构建了一个相对独立而"奇葩"的规则小世界。在这里,部分字符,我身非我,它们被赋予了新的作用。
佛曰:“一花一世界,一树一菩提”,正是字符组的生动写照。
下面我们一一阐述。
添加图片注释,不超过 140 字(可选)
众生平等是基本原则
我们知道,在正则表达式中,字符是有先后之分的,比如字符串“Excel”在正则表达式看来,就是首先是E,后面跟着x,再就是c……l排在最后。被匹配时,也是按这个顺序逐一去匹配。
但在字符组的内部,所有的字符都遵循着平等的原则。它们没有先来后到之分,不论资排辈,每个字符都有机会被选中。这就像是在一个没有等级之分的乌托邦社会,每个字符都有机会展现自己。
比如开篇所举的案例,字符组[Ee]中的E和e是平等的,并不是E被选了,e就不能被选了。
众生平等是字符组的基本原则 。
添加图片注释,不超过 140 字(可选)
特权字符无特权
我们知道,在字符组外面,那些元字符(特权字符),比如:问号`?`、竖杠`|`和句号`.`都是拥有特殊能力的特权人物。
但一旦它们进入字符组的世界,它们就会失去所有的特权,变得和普通字符一样。
比如那个牛逼哄哄,可以代表整个世界的"."(可代表除换行符之外的所有字符),人小权力大,整个世界都被它代表了,简单是牛13plus pro max extra。
添加图片注释,不超过 140 字(可选)
但是一旦进到字符组,它就乖乖地只代表他自己。
添加图片注释,不超过 140 字(可选)
其他的问号、星号小括号、大括号等,也是一样,在字符组内部只是普通字符。
也许,在字符组内部时,它们会象被贬黄州的苏轼一样自嘲:本字符上可陪玉皇大帝,下可陪卑田院乞儿。
添加图片注释,不超过 140 字(可选)
一身反骨,高呼“王侯将相宁有种乎”的脱字符
在元字符中有一个字符,比较特别,它就是脱字符^。
在之前的写的《5句话,让你的正则表达式水平突飞猛进!(第1-2句)》、《5句话,让你的正则表达式水平突飞猛进!(第3-5句)》文章,我们介绍过:脱字符^可用来定位字符串的开始位置。
看起来普普通通的它,放到字符组中,似乎也很安静,静静地只做自己。
=REGEXP(B1,"[符字脱^]+")
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
但是你不能将它放到“领导”位置【字符组的开始处】,一坐到“领导”位置,它就开始造反,高呼“王侯将相宁有种乎”,然后带领字符组内部的所有成员脱离组织。
比如:
公式1
=REGEXP(B1,"[^符字脱]+")
它会将“脱”“字”“符”三个字带离队伍
添加图片注释,不超过 140 字(可选)
公式2:
=TRANSPOSE(REGEXP(B1,"[^Excel偷懒的技术]+"))
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
混在队伍中间就爆发超能力的连字符-
还有一个字符比较特别,那就是连字符。
连字符它在字符组的开始和结尾,它只是它。
公式:
=REGEXP(B1,"[-ex]+")
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
但与一身反骨的脱字符不同,它一进到字符组内,并且在“人民群众”中间时,就会小宇宙爆发,将左右字符连成一片,代表从左边字符到右边字符的一群字符。
公式:
=REGEXP(B1,"[e-x]+")
添加图片注释,不超过 140 字(可选)
代表了从左边字符e到右边字符x中间的所有字符。也就是:
efghijklmnopqrstuvwx
【敲黑板】注意,注意:
如果写成
=REGEXP(B1,"[x-e]+")
会出错的,因为x比e大,小的要放前面。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
发挥稳定的转义符\(左斜杠)
转义符\是一个发挥稳定的大师,性能的稳定性快赶上中国男足了(中国男足一直稳定发挥,给足球评论员解说的机会从来都是“留中国队的时间不多了”)。
转义符在字符组外部,它都能够让特定字符发挥或失去特殊作用。在字符组中,它的魔力依旧不变,能够指定字符的特殊含义。
比如在字符组内\S还是表示非空白字符
添加图片注释,不超过 140 字(可选)
在字符组内\d还是代表数字
添加图片注释,不超过 140 字(可选)
扩展:
表示所有字符的正则表达式:
[\s\S]:匹配所有空白字符和非空白字符。
[\w\W]:匹配所有单词字符和非单词字符。
[\d\D]:匹配所有数字字符和非数字字符。
添加图片注释,不超过 140 字(可选)
最后,留一个思考题:
英文句号“.”代表除换行符之外的所有字符,\n代表换行符。那么
[.\n]
能不能代表所有字符?为什么?
欢迎在评论区留下你的答案。
上面这些小知识点,都是坑,一不小心就踩坑了。本文通俗易懂,看了本文,你就不会掉坑了。
欢迎阅读龙逸凡发表在Excel偷懒的技术公众号的其他正则表达式入门文章:
创作者俱乐部成员