正则表达式可以匹配某些特定的数据,如果你想要从庞大的文字信息中提取出一小段你需要的数据,那么正则表达式或许可以帮到你。例如:输入code,匹配所有包含code的数据


字符组

如果只是使用正则表达式来匹配文本,没有什么意义,毕竟检测一个文本中是否有另一个字符串本来就非常简单。正则表达式强大的地方在于它可以迅速地用极简单的方式达到字符串的复杂控制。例如:

当然,也可以匹配多个单词


区间

有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]。由于很麻烦,所以在正则表达式中采用-代表区间,依照法则,有以下三点:

  • 要匹配任意数字可以使用[0-9]
  • 如果想要匹配所有小写字母,可以写成[a-z]
  • 想要匹配所有大写字母可以写成[A-Z]

例如:
要匹配数据所有的数字、大小写字母

[0-9a-zA-Z]

匹配特殊字符

正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 - 号,该怎么办呢?这个时候我们需要对 - 号进行转义操作,即 \-。在正则中使用 \进行对特殊符号进行转义,对 - 进行转表示为 \-,即 \- 就代表了 - 号本身。例如:

当然想单纯表示 `(` 也可以用 `\(`


取反

到目前为止,我们定义的字符组都是由可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组。
例如:
匹配不包含数字的字符组

可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
再比如:

如果要匹配不包含小写字母的数据

[^a-z]

快捷匹配数字、字母、空白

以前,要匹配所有字母都是[A-Za-z],数字则用[0-9],能不能简洁一点?
正则表达式提供了\w\d来解决这个问题

快捷方式描述
\w与任意单词字符匹配,包括[A-Z]、[a-z]、[0-9]
\d与任意数字匹配

如果要匹配下列单词

[\w]

\s 快捷方式可以匹配空白字符,比如空格,tab、换行等。
如果要匹配下列数据

code\s

单词边界

\b 匹配的是单词的边界,例如

\bmaster\b 就仅匹配有边界的master单词。
当然其他类型的数据,比如数字也能匹配:

使用快捷方式匹配下列数据

\bcode\b

快捷方式取反

快捷方式也可以取反,例如对于 \w 的取反为 \W ,将小写改写成大写即可,其他快捷方式也遵循这个规则。比如:

如果要使用正则表达式匹配下列开头不以字母开头的单词

\W

开始与结束

正则表达式中 ^ 指定的是一个字符串的开始,$ 指定的是一个字符串的结束。
例如:

[photos]


[/photos]

要编写正则表达式匹配以OS结尾的字符串

OS$

任意字符

. 字符代表匹配任何单个字符,它只能出现在方括号以外
例如:

要匹配任意字母之后是ar的字符串。

.ar

可选字符和可选任意字符

有时,我们可能想要匹配一个单词的不同写法,比如colorcolour,或者honorhonour。这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次
例如:

在这里 u? 表示u是可选的,即可以出现也可以不出现,可以匹配的是 honorhonour

如果要用正则来匹配codejiaonang的不同写法

code.?jiaonang

重复

到目前为止,我们只是学习了关于仅出现一次的字符串匹配,在实际开发中,肯定不能满足需求,比如要匹配电话号码、身份证的时候就无法满足需求了。如果遇到这样的情况,我们可能期望一个字符组连续匹配好几次。在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。
例如:


重复区间

可能有时候,我们不知道具体要匹配字符组要重复的次数,可以使用重复区间,语法:{M,N},M是下界,N是上界。例如:

\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?号。


开闭区间

有时候我们可能遇到字符组的重复次数没有边界,例如:

闭区间不写即可表示匹配一个或无数个。

速写

还可以使用两个速写字符指定常见重复情况

+*
{1,}{0,}
1个到无数个0个到无数个

[photos]


[/photos]


匹配所有手机号码

现在请你使用正则表达式匹配手机号码,假设手机号码规则如下:

  • 必须是11位的数字;
  • 第一位数字必须以1开头,第二位数字可以是[3,4,5,7,8]中的任意一个,后面9个数是[0-9]中的任意一个数字。
^1[3-8]\d{9}

匹配网站地址

请编写正则表达式,匹配以 http开头,以/结尾的所有数据。

https?.+/$

实践:匹配电话号码

匹配电话号码,假设电话号码可以有下列两种方式:

  • 0XX-XXXXXXX,例如020-8810456
  • 0XXXXXXXXX,例如0208810456

020 代表区号,8810456是电话号码,区号第一个数字必须是0,电话号码的第一个数字必须大于等于1

^0\d{2}-?[^0]\d{6}$

实践:匹配所有王姓同学的信息

编写正则表达式匹配所有正确格式的王姓同学数据。

^王.+\d{4}