正则也就那么一回事

三分钟一节的编程课继续讨论:

这不是个传统形式的教程,也别指望看完这个就能学会正则表达式,甚至什么都学不会。

那为什么要看呢?就当聊天呗,又不花……等等,有爱就要先发电 !——老鼠爱发电

有这么个事儿

我这有个文档,Word 或者 Excel 或者 txt ……都行,这不重要。

内容是什么呢,统计的一些人的信息 ,你知道 ,这些信息挺敏感的,那我们要做一些处理,比如说把所有的手机号中间四位换成星号,很基本的操作。

但怎么换?这是个麻烦。我们都很清楚,十一位的数字是手机号,替换这些就行。但好像我们日常的搜索听不懂这个描述啊!

诶,这时候就需要用正则表达式了。所以正则表达式是什么呢?就是把你想要的东西描述清楚……(嘿,这不是定义,我只是想让你理解,定义什么的,谁在乎呢

我写写,你看看

如果我告诉你 \d 就代表一个数字,那你觉得应该怎么描述手机号呢?

\d\d\d\d\d\d\d\d\d\d\d

对,这不就是十一个数字么?严谨点,这叫做连续的十一个数字。当然,这么写你看着迷糊,我看着也迷糊,换种写法 :

\d{11}

和上面是一个意思。数字,连续 11 次。

继续描述需求

我们换成啥,前三个数字保持不变,然后中间四个换成星号,最后四个数字保持不变。所以我们要把手机号分成三组来处理,队形是 3-4-4。

\d{3}\d{4}\d{4}

替换的时候怎么保持不变呢?把它换成相同的内容,那就是没变化了。这时候我们就要说:把前三个数字换成原来那前三个数字……

(\d{3})\d{4}(\d{4})

别紧张,我就是把前后两段用小括号括了起来,现在我们用 $1 代表第一个小括号, $2 代表第二个小括号。那就是把上面的内容换成:

$1****$2

就此打住!!!

STOP!!!

先别往下了,把上面的再看一遍,就算你看懂了,也再看一遍。如果不乖,半夜会有可爱的小怪兽咬你脚趾头哦~

所以是什么

就是你说清楚那些文字的的形式,然后进行查找,还能在这个基础上进行替换啥的。而有些问题用一般的方式不好解决,就比如上面的问题,但是用正则描述就很轻松。

我觉得上面这类问题还是很常见的,所以,如果不喜欢学编程,那花半个小时学学正则表达式,多数时候是能给自己的工作和生活带来明显帮助的。

格式

有一些元字符,就是像 \d 代表一个数字这样的,毕竟我们总得用点什么去描述嘛。然后括号(大括号,小括号,方括号)都有特殊含义。然后这么写一串来描述你想要的内容。这就是正则表达式的主体部分。

还有一个 flag,不是立 flag,就是一个标识部分,用来说明是否需要区分大小写,是否全局搜索等等。或者说就是一些开关,这些开关都用一个字母来表示,加上这个字母,和不加这个字母,就是开关的两种状态。

具体的,在不同语言下有不同的表现,也没法一概而论,但总归都是这两部分。

比如在需要正则验证工具里,和一些编辑器里,都是填写主体,然后在后面的复选框勾选需要的 flag。

JavaScript 是这样的格式:

/\d{11}/gi

两根斜线(/)之间是主体,后面的(gi)是 flag。

但如果是 AHK ,就是这样的写法了:

gi)\d{11}

Flag 放在前面,然后半个小括号 ,后面是主体。

这些不用记啊,你就在需要的时候再去明确你用的工具需要怎样的格式就行了,记得找这两部分就对。

严谨

这很重要 ,这也很难。

很多人以为自己会了,但其实 一写起来到处出问题,就是不够严谨。

上面举例的表达式就不严谨。11 位的都是手机号码?不一定!你知道了,应该是 1 开头的。

第二位呢?只能是 3~9。

其实前三位有固定搭配的,可以使用的组合数量并不多 。当然全列举出来确实严谨了,也麻烦啊。这时候就要结合应用场景了,如果你这个文档里就只有手机号是长数字的内容,大概也不要考虑这些意外情况。

但就算全列举上,就真的严谨了么?150 开头的是不是手机号?内蒙古呼和浩特市的身份证号是 1501 开头的。嘿嘿嘿~

所以这玩意儿真正复杂的东西并不是学会它,真的好学,半小时足够学会日常知识了。但是想把表达式写的严谨不出错,这就需要练习了。

练习

也不是说就要去写表达式练习啊。你用自然语言描述也完全可以的,你看上面我不就是在描述么。

十一位数字 —— 1 开头的十一位数字 —— 前三位是特定组合的 11 位数字 —— 前三位是特定组合的 11 位数字(并且这段数字前后没有别的数字)

你要是这样能做到严谨描述 ,写正则也就没啥复杂得了。不信你再读一遍全文,会有不一样的感受的。

缺陷

正则确实好用,很多很多地方都可以用它来快速解决问题。真好!真赞!

但没必要把它吹到天上去,有些问题它解决不了,比如:它可以查找用 a、b、c、d、e 五个字母组成的单词(不限制使用次数,不限制必须全都使用,只要不超出范围就好)。但如果限制每个字母只能用一次,那对它来说经非常困难了。

还有,正则表达式的完全体是非常强大的,强大到上面这个问题也能解决(虽然很复杂),但是很多场景下并不支持它的完全体。所以你会遇到很多别扭的地方,比如很长的一个表达式,不好读,写着写着自己就迷糊了。其实是可以换行的,可以加入注释的,跟写代码一样,这样就清晰易读了,但是 ,能支持这么写的地方不多。

探讨

想学习就去学,教程遍地都是。练习呢,可以在这下面讨论,写出自己的目的,自己的答案,然后大家出谋划策,或者鸡蛋里挑骨头……抬杠长学问嘛。也不一定非得表达式,自然语言描述也未尝不可。


以及,别忘了,老鼠爱发电

2 Likes

小白在此感谢下ChatGPT :joy:

他的最大问题就是很可能不严谨

也可能写的不能运行……
仅供参考的AI

是这样,需要反复调教