匹配 2020 的数据
正则表达式可以匹配某些特定的数据,如果你想要从庞大的文字信息中提取出一小段你需要的数据,那么正则表达式或许能帮到你。
例如:输入 code 就可以匹配所有包含 code 的数据(图片中 code 左边的 / 和右边的的 / g 暂时可以忽略)
字符组
如果只是使用正则表达式来匹配文本,没有什么意义,毕竟检测一个文本中是否有另一个字符串本来就非常简单。
正则表达式强大的地方在于它可以迅速地用极简单的方式达到字符串的复杂控制。
字符组([])允许匹配一组可能出现的字符。
例如:
可以发现 [Pp] 既可以匹配大写的 P 也可以匹配小写的 p
区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]。
但是这样好吗?
如果要匹配从 a - z 的字母呢?我想你肯定不愿意从 a 写到 z 了!
为了适应这一点,正则表达式引擎在字符组中使用连字符 (-) 代表区间,依照这个规则,我们可以总结出三点:
- 要匹配任意数字可以使用[0-9];
- 如果想要匹配所有小写字母,可以写成[a-z];
- 想要匹配所有大写字母可以写成[A-Z]。
例如:
匹配特殊字符
正则表达使用了 – 号代表了区间,但是我们有时候需要匹配的符号就是 - 号,该怎么办呢?
这个时候我们需要对 - 号进行转义操作,即 \-。
在正则中使用 \ 就可以进行对特殊符号进行转义,对 – 进行转义就可以表示为 \-,即 \- 就代表了 – 号本身。
偷偷告诉你,转义符 \ 也适用于其他的符号,例如匹配圆括号可以使用 \(
例如:
匹配字母
[]字符组中可以放多个条件例如,想要匹配数字的小写字母可以这样写:[0-9a-z]
请使用正则表达式匹配字母,规则如下:
- 匹配 a - z 的小写字母;
- 匹配 A - F 的大写字母;
取反
到目前为止,我们定义的字符组都是由可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组。
例如:匹配不包含数字的字符组
可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
再看一个例子:
这里的 n[^e] 的意思就是 n 后面的字母不能为 e。
快捷匹配数字和字母
以目前学到的内容,如果想要匹配所有的字母,会使用[A-Za-z],要匹配数字会使用[0-9]
还有没有更简洁的方式呢?
正则表达式引擎提供了一些快捷方式如:\w 可以与任意单词字符匹配。
当我们想要匹配任意数字的时候也可以使用快捷方式 \d,d 即 digit 数字的意思,等价于[0-9]。
快捷方式 | 描述 |
\w | 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_ |
\d | 与任意数字匹配 |
匹配空白
\s 快捷方式可以匹配空白字符,比如空格,tab、换行等。
例如:
单词边界
\b 匹配的是单词的边界,例如,
\bmaster\b 就仅匹配有边界的 master 单词。
当然其他类型的数据,比如数字也能匹配:
快捷方式取反
快捷方式也可以取反,例如对于 \w 的取反为 \W,将小写改写成大写即可,其他快捷方式也遵循这个规则。
示例:
开始和结束
正则表达式中 ^ 指定的是一个字符串的开始,$ 指定的是一个字符串的结束。
例如:
指定字符串的结束:
任意字符
. 字符代表匹配任何单个字符,它只能出现在方括号以外。
值得注意的是: . 字符只有一个不能匹配的字符,也就是换行符(\n),不过要让. 字符与换行符匹配也是可以的,以后会讨论。
示例:
可选字符
有时,我们可能想要匹配一个单词的不同写法,比如 color 和 colour,或者 honor 与 honour。
这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
例如:
在这里 u? 表示 u 是可选的,即可以出现也可以不出现,可以匹配的是 honor 和 honour 。
通过这个案例可以知道? 的作用就是匹配它之前的字符 0 次或 1 次。
请你思考一个问题: .? 表达式能匹配什么呢?
重复
到目前为止,我们只是学习了关于仅出现一次的字符串匹配,在实际开发中,肯定不能满足需求,比如要匹配电话号码、身份证的时候就无法满足需求了。
如果遇到这样的情况,我们可能期望一个字符组连续匹配好几次。
在一个字符组后加上{N} 就可以表示在它之前的字符组出现 N 次。
例如:
重复区间
可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有 15 位也有 18 位的。
这里重复区间就可以出场了,语法:{M,N},M 是下界而 N 是上界。
举个例子:
\d{3,4} 既可以匹配 3 个数字也可以匹配 4 个数字,不过当有 4 个数字的时候,优先匹配的是 4 个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ? 号。
开闭区间
有时候我们可能遇到字符组的重复次数没有边界,例如:
闭区间不写即可表示匹配一个或无数个。
速写
还可以使用两个速写字符指定常见的重复情况,可以使用 + 匹配 1 个到无数个,使用 * 代表 0 个到无数个。
即:+ 等价于{1,},* 等价于{0,}。
+ 号示例:
* 号示例:
总结
多种匹配模式
实例 | 描述 |
[Pp]ython | 匹配“Python”或“python”。 |
rub[ye] | 匹配“ruby”或“rube”。 |
[abcdef] | 匹配中括号内的任意一个字母。 |
[0-9] | 匹配任何数字。类似于 [0123456789]。 |
[a-z] | 匹配任何小写字母。 |
[A-Z] | 匹配任何大写字母。 |
[a-zA-Z0-9] | 匹配任何字母及数字。 |
[^au] | 除了 au 字母以外的所有字符。 |
[^0-9] | 匹配除了数字外的字符。 |
实例 | 描述 |
. | 匹配除“\n”之外的任何单个字符。要匹配包括‘\n’在内的任何字符,请使用象‘[.\n]’的模式。 |
? | 匹配一个字符零次或一次,另一个作用是非贪婪模式 |
+ | 匹配 1 次或多次 |
* | 匹配 0 次或多次 |
\b | 匹配一个长度为 0 的子串 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。等价于‘[^A-Za-z0-9_]‘。 |
\b | 匹配一个长度为 0 的子串 |