1.入门
正则表达式可以匹配某些特定的数据,如果你想要从庞大的文字信息中提取出一小段你需要的数据,那么正则表达式或许能帮到你。
1.1字符组
**[]**允许匹配一组可能出现的字符。
例如:
1.想要只用字符组匹配Hello和hello
[Hh]ello
2.使用字符组匹配多个单词,匹配Jack,jack,jaca,Jaca
[Jj]ac[ka]
1.2区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]
但是这样好吗?
如果要匹配从a-z的字母呢?我想你肯定不愿意从a写到z了!
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)代表区间,依照这个规则,我们可以总结出三点:
- 要匹配任意数字可以使用
[0-9]; - 如果想要匹配所有小写字母,可以写成
[a-z]; - 想要匹配所有大写字母可以写成
[A-Z]。
例如:
1.匹配所有的数字,大小写字母
[0-9a-zA-Z]
2.匹配a-z的小写字母和A-F的大写字母
[a-zA-F]
1.3特殊字符
正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 -号,该怎么办呢?
这个时候我们需要对-号进行转义操作,即 \-。
在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 \-,即 \- 就代表了 - 号本身。
1.4取反
到目前为止,我们定义的字符组都是由可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组。
例如:匹配不包含数字的字符组,可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
[^0-9]
例如:
1.匹配爱后边不包含你的数据
爱[^你]
2.匹配不含小写字母的数据
[^a-z]
2.快捷方式
2.1常用字符快捷方式
| 字符 | 描述 |
|---|---|
| \d | 匹配0-9的数字 |
| \w | 匹配字母数字和下划线 |
| . | 匹配除换行符意外的任何单个字符 |
| \s | 匹配所有空白符,包含换行 |
| \S | 匹配非空白符,不包括换行 |
| \t | 匹配一个制表符 |
| \r | 匹配一个回车符 |
| \n | 匹配一个换行符 |
2.2常用定位符和限定符
| 字符 | 描述 |
|---|---|
| * | {0,} |
| + | {1,} |
| ? | 匹配前面的子表达式零次或一次,或者指明一个非贪婪限定符 |
| {n} | n 是一个非负整数。匹配确定的 n 次。 |
| {n,} | n 是一个非负整数。至少匹配n 次。 |
| {n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
| ^ | 匹配输入字符串开始的位置。 |
| $ | 匹配输入字符串结尾的位置。 |
| \b | 匹配一个单词边界,即字与空格间的位置。 |
| \B | 非单词边界匹配。 |
2.3举例
1.匹配空白分隔的单词
[a-zA-Z]+\s
2.匹配单词边界:仅匹配有边界的master单词。
\bmaster\b
3.匹配数字和小写字母
[\da-z]
4.快捷方式取反:请使用正则表达式匹配开头不以数字开头的单词
^\D
5.编写正则表达式匹配以Java结尾的字符串
Java$
6.匹配任意字母之后是ar的字符串
[a-zA-Z]ar
7.使用正则来匹配 favorite和favourite这两种写法
favou?rite
8.正则表达式提取电话号码,假设电话号码有两种规则:
- 以
3个数字开头,后面7个数字,例如:020-7281333 - 以
4个数字开头,后面7个数字,例如:0731-8283431
\d{3,4}-\d{7}
9.正则表达式匹配以f开头的数据.
^f.+
10.使用正则表达式匹配手机号码,假设手机号码规则如下:
- 必须是
11位的数字; - 第一位数字必须以
1开头,第二位数字可以是[3,4,5,7,8]中的任意一个,后面9个数是[0-9]中的任意一个数字。
1[3,4,5,7,8]\d{9}
11.编写正则表达式,匹配以 http开头,以/结尾的所有数据。
^http.*/$
3.实践
1.请提取所有以fu结尾的单词。
fu$
2.匹配电话号码,假设电话号码可以有下列两种方式:
- 0XX-XXXXXXX,例如
020-8810456; - 0XXXXXXXXX,例如
0208810456。
020 代表区号,8810456是电话号码,区号第一个数字必须是0,电话号码的第一个数字必须大于等于1。
[0]\d{2}\-?[1-9]\d{6}
3.编写正则表达式匹配所有王姓同学。
^王.+