正则表达式(Regular Expression,下文简称为RegEx或正则)是一个很棒的利器,它广泛应用于字符串的查找、匹配以及替换等场景,比如检查邮箱、手机号、URL等等。以其简短的表现形式和高效的查找匹配效率总是让人爱不释手。本文旨在帮助大家入门正则并学会解决常见的正则问题,希望能帮到大家。
一. 初识正则
1. 正则给人的直观印象
很多人觉得正则表达式很难,一般有两种情况:第一种是确实看的比较深入,这种大神太少了,至少我现在只认识了一个。另外一种情况就是被正则晦涩难懂的表达形式吓到了。本文主要是针对第二种人,我想说的是正则表达式真的不难,最起码学会初级和中级的应用不难。
2. 一个常见的正则小应用
相信很多人应该碰到过“检测用户输入的手机号或者邮箱是否合法”这种需求。这种例子用正则来做最合适不过了。比如下面的正则就可以判断一个邮箱是否合法。
^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$
我记得学正则之前看到这个表达方式后还是很迷惑的,什么鬼啊,完全看不出和邮箱有什么联系。不过现在看着就感觉很简单了,都是一些基础的正则符号,相信大家看完本文后,再回头看这个表达式会有豁然开朗的感觉。
二. 走进正则表达式的世界
上面说了那么多,目的是为了让大家对正则有个初步的概念。下面主要说明正则的基本语法。看完这部分之后,就能很轻松地看懂上面的那个匹配邮箱地址的正则了。
1. 元字符
元字符其实就是正则中的保留字符,这些字符在正则表达式中有着自己特殊的含义。就像Java中的class和interface关键字一样,他们不是普通的字符串,有着自己特殊的含义。
脱字节符:^
意思:代表一行文本的开头
用处:当我们想从一行文本的开头处匹配时,那么这个字符是个很好的选择。
美元符号:$
意思:代表一行文本文本的结尾
用处:当我们想匹配到一行文本的结尾时,那么这个字符是个很好的选择。
单词分界符:\b
意思:代表一个单词的开始或者结束
用处:当我们想匹配字符串中的某一个单词时,可以用这个符号匹配单词的开始和结束的位置
取非符号:^
意思:用在字符串组(下面会讲到)中,代表“非”的意思。
用处:这个符号和脱字节符号是同一个字符,只是用在不同的地方表示不同的意思,下面的字符组的例子我们会用到它。
点号通配符:.
意思:你没看错,这个小圆点,代指任何一个字符。(除了换行符)
用处:当我们对某个字符没有任何要求时,可以用它通配任意一个字符。
我对元字符的理解就是:正则匹配其实就是规则匹配,正则表达式其实就是一个规则表达式,元字符就是制定了规则,比如.
就代表任意一个字符,具体是什么字符不关心。只有这样,才能抽象出一定的规则,实现更灵活和复杂的匹配。
2. 量词的三个分类
上面提到了一些基础的元字符,一般匹配某一个或某一类字符。下面介绍一下三个量词字符‘*’‘+’‘?’。它们用来修饰基本的正则表达式,表示正则的匹配次数。
分类 | 匹配次数 |
---|---|
* | 匹配零次或者多次 |
+ | 最少匹配一次,可以匹配多次 |
? | 匹配零次,或者匹配一次 |
比如,一个用来匹配单词的基本的正则表达式:
\b\w\w\b // 匹配具有两个字母的单词。
那么,很显然,上面的正则只能匹配只有两个字符的单词,但是我们的目的是匹配所有的单词,那么该怎么搞呢,我们也没法确定这个单词到底有多少个字符。
这里就会用到量词了,如下:
\b\w\w*\b //这个正则和上面的那个比,只多了一个字符‘*’意义就完全变了。它表示“有任意多个\w”,这正好符合要求。
上面的例子中多了一个‘*’,意思是,符号‘*’前面的那个字符,出现零次或者多次。
当然,我们也可以改成下面的写法:
\b\w+\b