正则表达式

正则表达式在编码中经常可以做到四两拨千斤的效果,正则表达式是一个优秀程序员的必备技能。

正则表达式是一种文本模式,包括普通字符(例如,a到Z之间的字母)和特殊字符(元字符)。模式描述在搜索文本时要匹配一个或多个字符串。

1.用途

正则表达式的使用广泛,主要有以下四种:

1.检查文本中是否含有指定的特征词
2.找出文本中匹配特征词的位置
3.从文本中提取信息
4.修改文本

正则表达式通常用于两项任务,1.验证,2.搜索/替换。用于验证时,通常需要在前后加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限制需要根据搜索的要求而定。此外,也有可能要在前后加上\b而不是^和$

2.优先权顺序

在构造正则表达式之后,就可以像数学表达式一样来求值,也就是说,可以从左至右按照一个优先权顺序来求值。下表列出的操作符按照优先级从高到低排序:

操作符

描述

\|转义符

(),(?:),(?=),[]

圆括号和方括号

*,+,?,{n},{n,},{n,m}

限定符

^,$,\angmetacharacter

位置和顺序

3.直接量字符

字符

匹配

字母和数字字符

自身

\o

NUL字符

\t

制表符(\u0009)

\n

换行符(\u000A)

\v

垂直制表符(\u000B)

\f

换页符(\u000C)

\r

回车符(\u000D)

\xnn

由十六进制数nn指定的拉丁字符

\uxxx

是由十六进制xxx指定的Unicode字符

\cX

控制字符^X

如果记不住哪些标点符号需要反斜杠转义,可以在每个标点符号前都加上反斜杠。

4.字符类匹配

字符

匹配

[...]

方括号内的任意字符

[^...]

不在方括号内的任意字符

.

除了换行符和其他Unicode行终止符之外的任意字符

\w

任意ASCII字符组成的单词,等价于[a-zA-Z0-9]

\W

任意不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]

\s

任何Unidoce空白符

\S

任何非Unicode空白符,注意\W和\S的不同

\d

任何ASCII数字,等价于[0-9]

\D

除了ASCII数字之外的任何字符,等价于[^0-9]

[\b]

退格直接量

方括号又叫字符组,注意某些元字符在字符组外和字符组内的意义不同。例如:^在字符组外匹配行的开头,在字符组内表示排除字符;-在字符组外表示普通连字符号,在字符组内表示一个范围;问号和点号在字符组外通常是元字符,但在字符组内只是匹配普通字符而已。

5.重复字符类

字符

匹配

{n,m}

匹配前一项至少n次,但不超过m次

{n,}

匹配前一项n次或多次

{n}

匹配前一项n次

匹配前一项0次或1次,等价于{0,1}

+

匹配前一项一次或多次,等价于{1,}

*

匹配前一项0次或多次,等价于{0,}

JavaScript默认是贪婪匹配,也就是说匹配重复字符是尽可能多的匹配,而且允许后续的正则表达式也继续匹配。而进行非贪婪匹配,只需要在待匹配的字符后面跟随一个问号即可。比如,/a+/可以匹配一个或多个连续的字母a,当使用'aaa'作为匹配字符串时,/a+/会匹配三个字母,但是/a+?/会尽量少的匹配,只会匹配一个。

6.选择、分组和引用字符

字符

匹配

|

选择,匹配的是该符号左边的子表达式或右边的子表达式

(...)

组合,将几项组合为一个单元,这个单元可通过'*'、'+'、'?'和’|‘等符号修饰,而且可以记住和这个相匹配的字符串以供之后的引用使用

(?...)

只组合,组合但不记忆与该组想匹配的字符

\n

和第n个分组第一次匹配的字符相匹配

7.锚字符

字符

匹配

^

匹配字符串的开头,在多行检索中,匹配一行的开头

$

匹配字符串的结尾,在多行检索中,匹配一行的结尾

\A

只有匹配字符串开始处

\b

匹配一个单词的边界,简而言之,就是位于字符\w和字符\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置(但需要注意的是在字符组内[\b]匹配的是退格符)

\B

匹配非单词的边界位置

\Z

匹配字符串结束处或行尾

\z

只匹配字符串结束处

(?=p)

零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符

(?!p)

零宽负向先行断言,要求接下来的字符不与p匹配

8.记录字符

字符

匹配情况

(string)

用于反向引用的分组

$1

匹配的第一个分组的内容

$2

匹配的第二个分组的内容

$3

匹配的第三个分组的内容

9.修饰符

字符

匹配

i

忽略大小写

g

执行全局匹配,即找到所有匹配,而不是找到第一个之后就停止

m

多行匹配模式,^匹配一行的开头和字符串开头,$匹配行的结束和字符串的结束

10.用于匹配模式的String方法

方法

意义

search(reg)

参数:一个正则表达式。 返回:第一个与参数字符串匹配的位置,如果找不到就返回-1,不支持全局搜索。

replace(reg, str)

检索和替换。第一个参数:正则表达式,第二个参数:要进行替换的字符串,也可以是函数。设置了g修饰符,则替换所有匹配的子串,否则只替换第一个子串。通过在替换字符串中使用“$n”,可以使用子表达式相匹配的文本来替换字符。

match(reg)

参数:一个正则表达式。 返回:一个由匹配结果组成的数组。设置g则返回所有匹配结果,否则数组的第一个元素是匹配的字符串,剩下的是圆括号中的子表达式,即a[n]中存放的是$n的内容。

split(reg)

参数:正则表达式或字符串。 返回:子串组成的数组。

11.RegExp对象

RegExp构造函数

var pattern = new RegExp(arg1, arg2);

arg1:正则表达式中两条斜杠之间的文本

arg2:可选,指定修饰符:g,m,i

RegExp的属性

属性

意义

source

只读字符串,包含正则表达式的文本。

global

只读布尔值,是否带修饰符g

ignoreCase

只读布尔值,是否带修饰符i

multiline

只读布尔值,是否带修饰符m

lastIndex

可读写整数,如果带g修饰符,这个属性储存在整个字符串中下一次检索开始的位置,这个属性会被exec()和test()方法用到。

RegExp的方法

方法

意义

exec()

参数:字符串。在一个字符串中执行匹配检索,与String.macth()非全局检索类似,返回一个数组或null。

test()

参数:字符串。检测适合符合表达式模式,返回true或者false

toString()

转换成字符串形式

compile()

既可以改变搜索模式,也可以添加或删除第二个参数

12.举个例子

1.匹配输入邮箱是否合法(邮箱的格式一般为xxx@xxx.xxx,允许字母数字下划线)

var re = /^[a-zA-Z][a-zA-Z0-9_]*\@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/;
console.log(re.test('dawei@q126.com'));

正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

2.match方法

/*使用 match 方法获取获取匹配数组*/ 
var pattern = /box/ig;//全局搜索 
var str = 'This is a Box!,That is a Box too'; 
alert(str.match(pattern)); //匹配到两个 Box,Box
console.log(str.match(pattern).length);//获取数组的长度

3.search方法

/*使用 search 来查找匹配数据*/
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too'; 
console.log(str.search(pattern));//查找到返回位置,否则返回 -1

4.replace方法

/*使用 replace 替换匹配到的数据*/
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too'; 
console.log(str.replace(pattern, 'Cat'));//将 Box 替换成了 Cat

5.pslit方法

/*使用 split 拆分成字符串数组*/
 var pattern = / /ig;
 var str = 'This is a Box!,That is a Box too';         
 console.log(str.split(pattern)); // 将空格拆开分组成数组

6.exec方法

/* 统计子字符串出现的所有位置*/
function count(str){
    var b,r=/def/g;
    while(b = r.exec(str)){
        console.log(b);
    }
}
count('abcdefabcdefabcdefabcdef');

13.需要转义的字符

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

14.参考文献

JavaScript学习总结(八)正则表达式

Last updated