从三分钟一节的编程课继续讨论:
这不是个传统形式的教程,也别指望看完这个就能学会正则表达式,甚至什么都学不会。
那为什么要看呢?就当聊天呗,又不花……等等,有爱就要先发电 !——老鼠爱发电
有这么个事儿
我这有个文档,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 五个字母组成的单词(不限制使用次数,不限制必须全都使用,只要不超出范围就好)。但如果限制每个字母只能用一次,那对它来说经非常困难了。
还有,正则表达式的完全体是非常强大的,强大到上面这个问题也能解决(虽然很复杂),但是很多场景下并不支持它的完全体。所以你会遇到很多别扭的地方,比如很长的一个表达式,不好读,写着写着自己就迷糊了。其实是可以换行的,可以加入注释的,跟写代码一样,这样就清晰易读了,但是 ,能支持这么写的地方不多。
探讨
想学习就去学,教程遍地都是。练习呢,可以在这下面讨论,写出自己的目的,自己的答案,然后大家出谋划策,或者鸡蛋里挑骨头……抬杠长学问嘛。也不一定非得表达式,自然语言描述也未尝不可。
以及,别忘了,老鼠爱发电