学习正则表达式这里推荐编程胶囊的免费的
https://www.codejiaonang.com/#/course/regex_chapter1/0/0
边学边打代码,用几个小时就能基本上掌握了。
本文也是基于此网站
正则方法基础知识
1.字符组的表达
字符组([])允许匹配一组可能出现的字符
2.区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]。
但是这样好吗?
如果要匹配从a-z的字母呢?我想你肯定不愿意从a写到z了
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)代表区间,依照这个规则,我们可以总结出三点:
要匹配任意数字可以使用[0-9];
如果想要匹配所有小写字母,可以写成[a-z];
想要匹配所有大写字母可以写成[A-Z]。
3.匹配特殊字符
正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 -号,该怎么办呢?
这个时候我们需要对-号进行转义操作,即 -。
在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 -,即 - 就代表了 - 号本身。
4.取反
有时候我们可能希望根据不会出现的字符定义字符组。
可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
再看一个例子:
5.快捷匹配数字和字母
以目前学到的内容,如果想要匹配所有的字母,会使用[A-Za-z],要匹配数字会使用[0-9]
还有没有更简洁的方式呢?
正则表达式引擎提供了一些快捷方式如:\w 可以与任意单词字符匹配。
当我们想要匹配任意数字的时候也可以使用快捷方式\d,d即digit数字的意思,等价于[0-9]
6.匹配空白
\s快捷方式可以匹配空白字符,比如空格,tab、换行等。
7.单词边界
\b 匹配的是单词的边界,例如,
8.快键方式取反
快捷方式也可以取反,例如对于\w的取反为\W,将小写改写成大写即可,其他快捷方式也遵循这个规则。
9.开始和结束
正则表达式中 ^指定的是一个字符串的开始,$指定的是一个字符串的结束。
10.任意字符
.字符代表匹配任何单个字符,它只能出现在方括号以外。
11.可选字符
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。
这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
12. 重复
在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。
13.重复区间
可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。
这里重复区间就可以出场了,语法:{M,N},M是下界而N是上界。
14.开闭区间
有时候我们可能遇到字符组的重复次数没有边界,例如:
闭区间不写即可表示匹配一个或无数个。
#接下来是进阶网站为
https://codejiaonang.com/#/course/regex_chapter2/0/0
15.分组
15.1 定义
在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
要实现分组很简单,使用()即可。
(训练可以去网站训练)
15.2 或者条件
使用分组的同时还可以使用 或者(or)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号:
15.3 非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。
例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组
例题:
参考答案:(?:tel:|\d{2,5}-)(\d{5})
15.4 分组使用技巧
日期可以有很多格式,例如:
20200102
2020-01-02
2020-1-2
2020.01.02
2020 01 02
2020 1 2
2020/01/02
Copy
现在我们想要使用正则表达式将其中的年月日全都提取出来。
可以发现他们唯一的区别就在于分隔符和月份与日期,这个时候可以使用[]来匹配多种情况。
例如:
通过(\d{4})[-./\s]?(\d{1,2})[-./\s]?(\d{1,2}) 就可以从文本中将年月日分别提取出来了。
虽然这段正则表达式看起来内容挺多,但是还是很容易理解的,[-./\s]表示匹配三个可能出现的分隔符-./和空白,?表示匹配它们0次或者1次,其他年月日的数据使用\d{N}与分组结合就可以提取到目标数据。
15.5 分组的回溯引用
可以使用分组的回溯引用,使用\N可以引用编号为N的分组,比如\1表示第一个分组
16.先行断言
16.1正向先行断言
正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式
16.3 反向先行断言
反向先行断言(?!表达式)的作用是保证右边不能出现某字符。
17.后行断言
17.1 正向后行断言
正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
17.2反向后行断言
反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
/g /i 说明
1,/g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个
2,/i 表示匹配的时候不区分大小写