正则表达式-总结

322 阅读3分钟

一、正则表达式是什么

概括: 计算机通用文字处理工具

正则表达式(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""

后向查找(?<=) 引用子表达式(()),本身不被消费(?), 后向的(<,开口往后),正的查找(=)

后向负查找(?<!) 引用子表达式(()),本身不被消费(?), 后向的(<,开口往后),负的查找(!)

巩固练习

列出一些前端会用到的场景,如果熟悉正则的话,几行代码就可以搞定。不是说学好正则能有多大提升,但是用到的时候就会发现正则的便利性了。

  1. 手机号 13366668888 处理成 344格式133-1719-4243
var str = '13366668888';
str.replace(/(\d{3})(\d{4})(\d{4})/,'$1-$2-$3');
// 得到结果 "133-6666-8888"