前言
关于正则表达式,一直以其难学程度且适用场景有限而敬而远之,偶然看到一篇关于正则的文章,产生兴趣,因此记录一下学习笔记,方便日后查阅。
一、正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,许多程序设计语言都支持利用正则表达式进行字符串操作。
主要有两种操作:匹配和捕获
正则表达式的创建:
正则表达式是有元字符和修饰符组成,将元字符和修饰符写在/ /
中
基础笔记:
元字符:
\
: 转义字符
^
: 以某一个元字符开始
$
: 以某一个元字符结束
\n
: 匹配一个换行
.
:除了\n以外的任意字符
()
: 分组
x|y
: x或者y中第一个
[xyz]
:x或者y或者z中的一个
[^xyz]
:除了三个以外的任意一个字符
[a-z]
:a 和 z 之间的任意字符
[^a-z]
:除了a 和 z 之间的任意字符
\d
:表示 0-9 之间的数字
\D
:除了0-9之间的数字以外的任意字符
\b
:匹配一个边界符 w1 w2
\w
:数字、字母、下划线中的任意字符 [0-9a-zA-Z_]
\s
:匹配一个空白字符 空格、一个制表符、换页符...
二、正则精准匹配
精准匹配是指匹配字符串中的某个子串,使用test()
方法,匹配某个模式,返回true/false
- 单个匹配模式
let testString = 'test string,for reference only';
let testRegex = /reference/;
let testResult = testRegex.test(testString);
console.log(testResult); //true
- 多个匹配模式
使用操作符号|
匹配多个字符串
let testString = 'test string,for reference only';
let testRegexMore = /test|for|only/;
let testMore = testRegexMore.test(testString);
console.log(testMore); //true
三、模糊匹配
精准匹配只能匹配字符串中的某个子串,正则表达式之所以强大,是因为其能实现模糊匹配,满足更多的应用场景,使用match()
完成
console.log('Cad cAd caD CAd CaD cAD'.match(/cad/gi));
// [ 'Cad', 'cAd', 'caD', 'CAd', 'CaD', 'cAD' ]
- 匹配任意字符
正则使用.
完成任意字符的匹配
console.log('Cad cAd caD CAd CaD cAD'.match(/.ad/gi));
// [ 'Cad', 'cAd', 'caD', 'CAd', 'CaD', 'cAD' ]
- 匹配数量
量词元字符(数量元字符)
*
:出现零到多次
+
:出现一到多次
?
:出现零次或者一次
{n}
:出现 n 次
{n,}
:出现 n 到多次
{n,m}
:出现 n 到 m 次
标志字符
g
:全局搜索,记忆方式 global
i
:不区分大小写,记忆方式 ignore
m
:多行搜索
1. 出现零到多次
console.log('hi'.match(/hi*/gi)); //[ 'hi' ]
console.log('hiiiiiiii'.match(/hi*/gi)); //[ 'hiiiiiiii' ]
console.log('hiihihi'.match(/hi*/gi)); //[ 'hii', 'hi', 'hi' ]
2. 出现一到多次
let matchMoreStr = "Tallahassee";
console.log(matchMoreStr.match(/s+/gi)); // [ 'ss' ]
console.log(matchMoreStr.match(/a+/gi)); //[ 'a', 'a', 'a' ]
3. 出现零次或者一次
console.log((/colou?r/i).test('colour')); // true
console.log((/colou?r/i).test('Color')); // true
console.log((/colou?r/i).test('Colouuur')); // false
4. 出现指定次数
let matchStr = "cde cdde cddde cdddde cddddde";
let matchReg = /cd{3,5}e/g;
console.log(matchStr.match(matchReg)); // [ 'cddde', 'cdddde', 'cddddde' ]
console.log(matchStr.match(/cd{1}e/g)); // [ 'cde' ]
console.log(matchStr.match(/cd{1,}e/g)); // [ 'cde', 'cdde', 'cddde', 'cdddde', 'cddddde' ]
- 匹配一组字符
使用[]
匹配一组字符
console.log('bat cst sat dat eat at act'.match(/[bde]at/gi)); // [ 'bat', 'dat', 'eat' ]
console.log('bat cst sat eat dat at act'.match(/[a-e]at/gi)); // [ 'bat', 'eat', 'dat' ]
- 匹配一组不想拥有的字符
匹配不想拥有的一组字符,需要使用否定字符集^
let notVowels = /[^aeiou]/gi;
console.log('nameasasasasa'.match(notVowels)); // [ 'n', 'm', 's', 's', 's', 's' ]
- 匹配字母
console.log('Bat cst sat eat dat at act'.match(/[a-z]at/g)); // [ 'sat', 'eat', 'dat' ]
console.log('Bat cst sat eat dat at act'.match(/[A-Z]at/g)); // [ 'Bat' ]
console.log('Bat cst sat eat dat at act'.match(/[a-zA-Z]at/g)); //[ 'Bat', 'sat', 'eat', 'dat' ]=
- 匹配数字/非数字
可以使用字符集[0-9]
,或者使用简写\d
\D
表示\d
的反义
console.log('Bat1929287373 cst sat eat dat at act'.match(/[0-9]/g));
// [ '1', '9', '2', '9', '2', '8', '7', '3', '7', '3' ]
console.log('Bat1929287373 cst'.match(/\D/g));
// [ 'B', 'a', 't', ' ', 'c', 's', 't' ]
- 匹配所有的字母和数字
可以使用\word
简写,\w
console.log(/[A-Za-z0-9_]+/.test('42asas'));
console.log(/\w+/.test('name32'));
- 匹配所有的非字母和非数字
\W
表示\w
的反义
console.log(/\W+/g.test('%^^&'));
console.log(/\W+/.test('name32'));
-匹配空格/非空格
使用 \s
来匹配空格和回车符
\S
表示\s
的反义
console.log('Love you three thousand'.match(/\s/g)); //[ ' ', ' ', ' ' ]
console.log('Love you three thousand'.match(/\S/g));
// [ 'L', 'o','v', 'e','y','o','u','t','h','r','e','e','t','h','o','u','s','a','n','d' ]
- 匹配起始字符串
匹配起始字符串,使用插入符号^
,但要放到开头,放到字符集中间匹配不到
console.log('Love you three thousand'.match(/^Love/g)); //[ 'Love' ]
console.log('Love you three thousand'.match(/^you/g)); //null
- 匹配结束字符串
使用$
来判断字符串是否是以规定的字符结尾
console.log('Love you three thousand'.match(/thousand$/g)); //[ 'thousand' ]
console.log('Love you three thousand'.match(/three$/g)); //null
四、惰性匹配
默认情况下,正则表达式是贪婪的(匹配满足给定要求的字符串的最长部分),但是一般情况下,我们只需要字符串中与给定要求匹配的最小部分,因此需要阻止正则表达式的贪婪匹配
使用 ?
阻止贪婪模式(惰性匹配 )
console.log('catnamebatdat'.match(/c[a-z]*t/gi)); //[ 'catnamebatdat' ]
console.log('catnamebatdat'.match(/c[a-z]*?t/gi)); //['cat' ]