一、正则表达式是什么
概括: 计算机通用文字处理工具
正则表达式(Regular Expression)其实就是一门工具,目的是为了字符串模式匹配,从而实现搜索和替换功能。
二、从字符出发
1.匹配单字符
例如/a/,代表精确匹配到结果。
如果要匹配特殊字符,例如'*',换行符(\n),回车符(\r),制表符(\t). 空白符(\s) 需要用\使其原先的它失去其本来的含义
/./ 代表匹配特殊符号外所有的字符
2.匹配多字符
除了单字符匹配外,明显不够的,正则中加上区间'-'和集合[]的概念,通常会一起使用。
- : 定义一个区间,例如A-Z,其首尾字符在 ASCII 字符集里面间
[]: 定义一个字符集合,例如[123] 会同时匹配1,2,3三个字符。 [] 里边所有的 ** '.'、''都表示原意 **
/[A-Za-z]/ 匹配所有的单词字母
/[0-9]/ 配置所有的数组
三、逻辑表达
与( 无 )、或( | )、非( ! )
四、匹配次数
正则表达式中可以匹配零次到多次的过程({m,n} + * ?)
{m, n}: 匹配前面一个表达式至少m次,至多n次。{m}表示匹配m次,{m,}至少匹配m次
+: 匹配前面一个表达式一次或多次 ,至少会有一次
* :匹配前面一个表达零次或者多次
?: 匹配前一个表达式零次或者一次
------特殊:单独使用匹配前面一个表达式零次或者一次,如果前面有一些特殊数量元字符*,+,?,{},就会变成非贪婪模式或者最小匹配---
比如对 "123abc" 应用 /\d+/ 将会返回 "123",如果使用/\d+?/,那么就只会匹配到 "1"。
五、位置边界
正则表达式中可以使用 ^ \b \$匹配位置
^ : 单独使用匹配表达式的开始
\b : 匹配单词边界
\B : 匹配非单词边界
\$ : 匹配表达式结束
六、子表达式
分组
正则表达式中可以()表示分组,每个括号里边的是子表达式
所有以(和)元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式,它也是构成高级正则表达式的基础
回溯引用
概念:指的是模式的后面部分引用前面已经匹配到的子字符串
引用: 指的是模式的后面部分引用前面已经匹配到的子字符串。\1,\2,\3 或者 $1,$2,$3 按顺序表示引用第几个表达式,\0表示应用全部表达式
var str = 'abc abc 123';
str.replace(/(ab)c/g,'$1g');
// 得到结果 'abg abg 123'
非捕获组: (?:) 引用表达式(()), 本身不被消费(?),引用(:)
前向查找: (?=) 引用子表达式(()),本身不被消费(?), 正向的查找(=)
var str = 'apple people';
str.replace(/(?=ple)/, 'test')
// 结果: "aptestple people"
前向负查找: (?!) 引用子表达式(()),本身不被消费(?), 负向的查找(!)
var str = 'apple people';
str.replace(/(?!=ple)/, 'test')
// 结果: ""testapple people""
后向查找: (?<=) 引用子表达式(()),本身不被消费(?), 后向的(<,开口往后),正的查找(=)
后向负查找: (?<!) 引用子表达式(()),本身不被消费(?), 后向的(<,开口往后),负的查找(!)
巩固练习
列出一些前端会用到的场景,如果熟悉正则的话,几行代码就可以搞定。不是说学好正则能有多大提升,但是用到的时候就会发现正则的便利性了。
- 手机号 13366668888 处理成 344格式133-1719-4243
var str = '13366668888';
str.replace(/(\d{3})(\d{4})(\d{4})/,'$1-$2-$3');
// 得到结果 "133-6666-8888"