说道正则表达式大家都知道这个功能很强大,但是大家在学习的过程中又是一头雾水。因为那些符号和字符有点深奥,作者也是这样子的。
我在学习正则表达的过程中,有三个疑惑的点:
- 第一:在学习的过程中,如何去边学习边实践,致知于行呢?
- 第二:为什么表达式要这么写
- 第三:为什么输入一个字符串,经过正则表达式函数后,输出就是这个结果。
针对第一点,推荐一个正则表达式在线测试工具:regex101.com,另外也可以自己编程调用正则表达式的API来进行验证。
正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。 例如:一个正则表达式 the,它表示一个规则:由字母t开始,接着是h,再接着是e。
"the" => The fat cat sat on the mat.
1、正则表达式的主要依赖——元字符
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符除了换行符。 |
[ ] | 字符种类。匹配方括号内的任意字符。 |
[^ ] 否定的字符种类。匹配除了方括号里的任意字符 | |
* | 匹配>=0个重复的在*号之前的字符。 |
+ | 匹配>=1个重复的+号前的字符。 |
? | 标记?之前的字符为可选. |
{n,m} | 匹配num个大括号之前的字符或字符集 (n <= num <= m). |
(xyz) | 字符集,匹配与 xyz 完全相等的字符串. |
| | 或运算符,匹配符号前或后的字符. |
\ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配. |
$ | 从末端开始匹配. |
-
或运算符:a (cat|dog),a 后面可以匹配cat或者dog。中间的括号必不可少。
-
花括号:输入 /ab{2,4}c,表示a和c之间的b可以出现2个到4个。
{2,}表示可以是2或2个以上的b -
锚点
在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。^ 指定开头,$ 指定结尾。
^ 用来检查匹配的字符串是否在所匹配字符串的开头。
$ 号 用来匹配字符是否是最后一个。
2、重复次数
后面跟着元字符 +,* or ? 的,用来指定匹配子模式的次数。 这些元字符在不同的情况下有着不同的意思。
-
加号:输入:/(ab)+c,表示ab可以出现多次或1次,后面还要有c。 >=1
-
问号:输入:/ab?c,可以匹配一个或零个字母b ,可有可无
-
星号:输入:/ab*c,可以匹配前面的字母b, 可以是1个b,多个b,没有b。 >=0
2、 字符类
- 字符类——方括号:输入:/[abc]+,匹配与abc相关的单词。只要出现abc的字母就会匹配。
指定字符的范围
输入:
[a-z]+,匹配所有带小写字母的
[A-Z]+:匹配所有大写字母的
[0-9]+:匹配所有带有数字的
[^0-9]+:表示匹配所有的非数字字符,包括换行符
-
字符类——元字符
正则表达式为我们预先定义好了一系列的常用字符类型,比如数字,空白符,单词开头和结尾等。大部分元字符都是以反斜杠开头。大写表示反义 -
简写字符集
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 除换行符外的所有字符 |
\W | 匹配所有非字母数字,即符号,等同于: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}] |
\S | 匹配所有非空格字符: [^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符 |
4、贪婪匹配和懒惰匹配
正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。
只匹配所有的<html>标签, +和.可以匹配出两个html之间的所有字符串。
加上?之后,为懒惰模式。
5 实战
匹配所有的RGB值
step1 首先前面要加上#,
step2 接下来后面可以是数字,字母等字符,但是只能限定在0-9和A-F,a-f之间
step3 长度为6
step4 后面就是单词的边界了,不能再有其他单词,叫\b
最后结果如下:
匹配IP地址
上面这样写对于256这种不合法的IP地址过滤不掉,需要将数字大小限定在255以内。
改进方法:
step1 : 数字部分 : 大于200的, (25[0-5])|(2[0-4]\d) 小于200的,[01]?\d\d?
step2: 加上 . : .
step3: 重复三次,在后面加上数字
step4: 可以看到前面有数字小数点无法过滤,所有还需要加上^和$