出场

为了匹配规定模式的文本
为了守护世界的和平
我们是穿梭在银河的正则表达式
就是这样~喵~

好用的正则表达式可视化工具:https://regexper.com/

语法

//字面量varregExp1=/pattern/flags;//或用构造函数varregExp2=newRegExp(pattern[,flags]);

pattern:正则表达式的匹配模式
flags:可选,正则表达式的标识,也可选多个。g全局匹配,i忽略大小写,m匹配多行

一颗超简单的栗子:

varregExp=/abc/;"abcdefg".replace(regExp,"WOW");//"WOWdefg"

常用特殊字符

1.字符集合

字符举例含义
[][xyz]xyz中任意一个字符等价于[x-z]
[^][^xyz]匹配任意不在xyz中的一个字符,等价于[^x-z](注意与^x区分,后者表示匹配以x开头的字符)
[-][1-3]匹配123中的任意一个字符,等价于[123]。注意:连字符只有出现在方括号中才表示连续的字符序列。

2.预定义模式

预定义模式就是某些常用模式的简写。

字符含义
.除\r和\n之外的任意字符,等价于[^\r\n]
\d数字0-9,等价于[0-9]
\D非数字字符,等价于[^0-9]
\w字母数字下划线,等价于[A-Za-z0-9_]
\W非字母数字下划线,等价于[^A-Za-z0-9_]
\s空白符
\S非空白符
\n换行符

3.需要转义的字符

正则模式中,需要用斜杠转义的:

*?$^.|\(){}[]

需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。

4.边界

字符举例含义
^^a以a开头(注意与[^]区分,后者表示匹配不在[^]中的元素)
$a$以a结尾
\b\bsmart,smart\b单词边界,即[A-Za-z0-9_]之外的字符
\B\Bsmart非单词边界

举个栗子说\b和\B:

"Youaresmart,butsheissmarter.".replace(/smart\b/,"kind");//"Youarekind,butsheissmarter.""Youaresmart,butsheissmarter.".replace(/smart\B/,"kind");//"Youaresmart,butsheiskinder."

if(不懂){就置几动手试试吧(ง•̀_•́)ง}

5.数量词

字符含义
?匹配前面的模式0或1次{0,1}
*匹配前面的模式0或多次{0,}
匹配前面的模式1或多次{1,}
{n}匹配前面的模式n次
{n,}匹配前面的模式至少n次
{n,m}匹配前面的模式至少n次,至多m次
{0,m}匹配前面的模式至多m次
x(?=y)只有x后面紧跟着y时,才匹配x,但是y不是匹配结果的一部分。例如/smart(?=girl)/只有后面有girl时,才匹配smart,但是girl不是匹配结果的一部分。
x(?!y)只有x后面不紧跟着y时,才匹配x。例如/\d(?!\.)/只有一个数字后面没有紧跟着小数点时才会匹配该数字,/\d(?!\.)/.exec("3.141")匹配结果是141

6.贪婪与懒惰(非贪婪)

默认是贪婪模式匹配,即匹配尽可能多的字符。

varregExp1=/\d{3,6}/;"1234567890".replace(regExp1,"X");//"X7890"

若想手动开启懒惰模式,需要在模式后加?

varregExp1=/\d{3,6}?/;"1234567890".replace(regExp1,"X");//"X4567890"

7.分组与反向引用

分组又叫“子表达式”,把完整的正则表达式分成一个个小组,然后反过来用“组号”去引用这些小组就叫“反向引用”。

用例子来说:

//无分组varregExp1=/abc{2}/;//这样量词{2}只能匹配到c一个字符//分组varregExp2=/(abc){2}/;//这样量词{2}就可以匹配到abc三个字符啦//同时abc也有了一个组号$1

再看一个栗子:

varreg=/(\d{1}).*(\d{2}).*(\d{3})/;"1sss23sss456".replace(reg,"$1?$2?$3");//"1?23?456"

上面的栗子换一种使用分组的方式:

varreg=/(\d{1}).*(\d{2}).*(\d{3})/;varresult=reg.exec("1sss23sss456");console.log(result[1]"-"result[2]"-"result[3]);//"1-23-456"

组匹配非常有用,下面是一个匹配网页标签的例子:

vartagName=/