正则,你这个磨人的小妖精

  • 白小霁
  • 3 Minutes
  • May 25, 2017

前言

正则这个东西,对于任何程序员掌握了只有好处没有坏处的。刚刚好昨天再写报告的时候,要去网页上复制自己的问卷,结果刚刚好使用正则替换的方式,将整个格式修改好了,那一刻再次体验到编程的好感,总之学习正则的难度不大,够自己用就好了,缺点是如果长时间不用的话,几乎忘记的一干二净。建议就是设计到文字的替换什么的就逼自己使用正则。下面是正则的介绍和知识点。
注:因为正则表达式太长了,下面都是缩写为正则。

正则的作用

在我们上网的过程中,会去经常查找某些符合复杂规则的字符串,如想把中国所有座机号都匹配上了。这种时候正则就派上用场了。
而正则的作用就是:

入门

我们先来一个小热身,当你想去匹配hi这个单词的时候,你可以使用hi这样的方式去查找,那你有话说了这不就是我们普通的查找方式吗!就是最简单的正则了。而正则通常是忽略大小写的,所以这个正则很可以匹配到hi、HI、Hi、hL这几种情况。
因为上诉的正则还会匹配到单词中出现的hi的字符,比如him、high等。这时我们又有一个需求了,我们不想匹配到这些字符,我们仅仅是想匹配到hi这个字符。那我们应该使用\bhi\b
\b是就是一个元字符(metacharacter),说白了就是一个特殊字符,是单词boundary的缩写(这个只是为了让你好记点),代表着单词的开头或结尾,就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

元字符(自学部分)

  1. 表示位置的
    • \b 匹配单词的开始或结束
    • ^ 匹配字符串的开始
    • $ 匹配字符串的结尾
  2. 字符匹配
    • . 匹配除了换行符以外的任意单个字符
    • \w 匹配字母或数字或下划线或汉字
    • \d 匹配数字(0-9)
    • \s 匹配任意空白符(任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等)
  3. 限定符(限定重复次数)
    • * 重复零次或更多次(0+)
    • ? 重复零次或一次(0,1)
    • + 重复一次或更多次(1+)
    • {num} 重复num次
    • {n,m} 重复n到m次
    • {n,} 重复n次或更多次
  4. 反义
    • \W 匹配任意不是字母,数字,下划线,汉字的字符
    • \S 匹配任意不是空白符的字符
    • \D 匹配任意非数字的字符
    • \B 匹配不是单词开头或结束的位置
    • [^x] 匹配除了x以外的任意字符

字符组合

如果你想匹配一些自定义的字符集,你便要使用[]来划定你想匹配的东西,如:想匹配元音字母a,e,i,o,u,便可以[aeiuo]这样使用,就是匹配任何一个出现在中括号里面的任意字符。要没有发现这个和我们中学学到的区间很像,其实就是表示一个范围,就像[0-9]代表的就是\d的意思。

转义

如果我就想匹配.了,因为在正则中给这个字符定义了特殊的含义,所以你要使用的时候也能简单做一次转移就好了,使用符号\。如匹配一个点[\.]

其他需要反复琢磨的东西

如果你想要出现两种情况,在逻辑上有一层或的关系,你就可以使用|符号,但请记住该符号的两次是两个完整的正则。

如果你想在后面引用前面匹配到一样的东西,你需要对前面的东西先要进行一次分组,使用()这个符号,后面地方使用\num,这里的num就是第几个分组,当然分组看的小括号是正则表达式从左到右,最左的就是第一个分组。

说到贪婪和懒惰的情况,正则匹配默认就是贪婪匹配,要是得懒惰的匹配在你想要匹配地方尽可能少的出现的地方加一个?便可。

参考博客

30分钟学会正则表达式