正则表达式——正则入门
正则表达式——正则入门
正则测试地址:https://regex101.com/
先从一个例子开始正则表达式。
书写一个匹配手机号的正则表达式,为了方便讨论,假定手机号是1开头,第二位只能是3、5、8中的其中一个,总共11位的数字,形如13xxxxxxxxx。
匹配手机号的正则表达式为:^1[358]\d{9}$,下面介绍此正则表达式中的各个符号的含义。
符号含义简介
^:表示字符串的开头,后面紧接着1,表示匹配的字符串要以"1"开头。
1:就是匹配“1”本身,^不匹配字符,所以1就是匹配字符串的第一个字符。
[358]:表示可以匹配3、5、8中的任何一个,当然,也只能匹配一个字符;[abc]整个表达式用来匹配一个字符,这个被匹配字符可以是abc中的任一个。
\d:表示一个数字字符,等同于[0123456789],匹配0123456789中的任何一个数字,[0123456789]也可以写作[0-9]。
{9}:表示前面的\d重复9次,即有9个数字。重复次数可以设定范围值或是最小值,{m,n}表示前面的元素或是表达式最少重复m次,最多重复n次;{m,}表示前面的元素或是表达式最少重复m次,不设定最大重复次数。
$:表示字符串的结尾,它前面的\d{9}数字重复9次后,后面就不能再有字符了。

如上图所示,13666666666符合正则表达式^1[358]\d{9}$。
"13666666666"的第一位数字1,匹配正则表达式中的^1,以数字1开头;第二位数字3匹配表达式中的[358],属于3、5、8中的一个;第三位至第十一位的9个数字,匹配表达式中的\d{9};第十一位数字后不再有字符,匹配表达式$。
"13"匹配表达式中的^1[358],不匹配\d{9},后续没有9个数字;"71366666666"不匹配^1,没有以数字1开头;"136666666666"匹配^1[358]\d{9},不匹配$,9个数字后还有数字;"abf"不匹配^1,没有以数字1开头。
匹配一个字符
想要匹配字符串"abc"中的a,正则表达式a即可完成任务。在正则表达式中,可以使用字母或是数字,匹配其本身。正则表达式大小写敏感。

在正则中,.(英文句点)可以用来匹配任意字符(换行符除外),包括它自己。

匹配一组字符中的一个
正则表达式[an]表示匹配a或者n,[]中的字符可以理解为是"或"的关系。

在[]中可以使用区间表达式,例如[0-9]表示匹配0到9的数字,即所有数字;[a-z]表示匹配所有小写英文字母,[A-Z]表示匹配所有大写英文字母,[a-f]表示匹配a-f的所有小写字母。

有时我们希望不要匹配到某些字符,此时也可以用[]。例如[^abcdef]表示不匹配abcdef中的任何一个,其他字符都可以,有些类似于取反。

同样的,字符区间一样可以用于取反操作。

需要注意的是,[]中的^作用范围是整个[]。例如[^a-f0-9]表示不能匹配a-f的小写字母以及0-9的所有数字。

元字符
之前提到过,.可以匹配所有单个字符(换行符除外),如果只是想匹配".“本身呢?此时只需要在”.“前面加一个转义符”\“即可,即正则表达式\.。

同样的,之前提到的”["、"]“也可以通过加转义符来匹配本身,\[、\]。”\"同样可以通过转义来匹配其本身,\\。

其他常用元字符如下:
| 空白元字符 | 含义 |
|---|---|
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 制表符(Tab键) |
| \v | 垂直制表符 |
| 元字符 | 含义 |
|---|---|
| \d | 任何一个数字字符(等价于[0-9]) |
| \D | 任何一个非数字字符(等价于[^0-9]) |
| \w | 任何一个单词字符(数字,大小写字母,下划线)(等价于[0-9a-zA-Z_]) |
| \W | 任何一个非单词字符(即非数字,非大小写字母,非下划线)(等价于[^0-9a-zA-Z_]) |
| \s | 任何一个空白字符(等价于[\f\n\r\t\v]) |
| \S | 任何一个非空白字符(等价于[^\f\n\r\t\v]) |
重复匹配
之前说的都是匹配一个字符,现在说一下如何重复匹配一个字符。
\d+表示匹配\d一次或多次

\d*表示匹配\d零次、一次或多次

\d?表示匹配\d零次或一次

除了+、*、?可以重复匹配外,还可以使用{}进行更精确的重复匹配次数控制。
\d{3,5}表示\d最少匹配三次,最多匹配五次

\d{3,}表示\d最少匹配三次,最大匹配次数不做限制

\d{3}表示\d匹配三次

位置匹配
\b表示匹配单词边界,也就是一个位置,此位置一边是单词字符(\w代表的内容,即数字,大小写字母,下划线_),另一边不是单词字符。可以看到,字符串"23 word on"共有六个位置属于单词边界。

^表示匹配字符串开头,字符串"23 word on"只有一个位置匹配成功。"^“用在”[]"中时表示取反,否则是匹配字符串开头。

$表示匹配字符串结尾,字符串"23 word on"只有一个位置匹配成功。

总结
本文主要介绍了正则表达式中,匹配一个字符,匹配一组字符中的一个,什么是元字符,如何控制重复匹配,最后学习了几个简单的位置匹配。
下一篇:贪婪、非贪婪与占有模式