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

龙逸凡
龙逸凡

创作者俱乐部成员

添加图片注释,不超过 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偷懒的技术公众号的其他正则表达式入门文章:

掌握这一点,就能正确地写出正则表达式了

5句话,让你的正则表达式水平突飞猛进!(第1-2句)

5句话,让你的正则表达式水平突飞猛进!(第3-5句)

①WPS新增的REGEXP函数,非常好用!强烈推荐

②WPS新增的REGEXP函数,有何特别魔力让人如此推荐?

③WPS新增的REGEXP函数,刚琢磨出的新颖用法

重庆
浏览 265
4
7
分享
7 +1
4
4 +1
全部评论 4
 
saAE86
学习
· 广东省
回复
 
亂雲飛渡
收藏学习
· 广东省
回复
 
幸福春
精华啊学习了
· 山东省
回复
 
懒得批爆
懒得批爆

创作者俱乐部成员

新新事物可能还需要个几年才能普及大众。
· 四川省
回复