js正则表达式

1.正则表达式的定义

var pattern = new RegExp('xyz', i)
var pattern = /xyz/i
var pattern = new RegExp(/xyz/i)
var pattern = new RegExp(/xyz/ig,i) //这个只有ES6支持,后面的修饰符会覆盖前面的

2.直接量字符

按照字面含义进行匹配的字符。具有特殊含义的标点符号用反斜杠()进行转义。

3.字符类

将直接量字符串放在方括号内就组成了字符类(character class)。一个字符类可以匹配它包含的任意字符。

可以通过"^"符号来定义否定字符类,匹配所有不包含在方括号内的字符。

字符类可以使用连字符来表示字符范围。例如:/[a-z]/。

表3:正则表达式的字符类

字符  匹配

[...]   方括号内的任意字符

[^...]  不在方括号内的任意字符

.    除换行符和其它Unicode行终止符之外的任意字符

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

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

s    任何Unicode空白符

S   任何非Unicode空白符

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

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

[]  直接退格量(特例)

4.重复

在正则模式之后跟随用以指定字符重复的标记。

表4:正则表达式的重复字符语法

字符    含义

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

{n, }     匹配前一项n次或者更多次

{n}       匹配前一项n次

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

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

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

非贪婪的重复=》在匹配字符后面加一个问号。

5.选择、分组和引用

选择:

字符"|"用于分割被选择的字符。

注意:选择项的尝试匹配次序是从左到右。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配

例如:/a|ab/匹配字符串ab时,只匹配第一个字符a。

分组:

正则表达式圆括号的作用:

(1)把单独的项组合成表达式。

(2)在完整的模式中定义子模式。当一个正则表达式成功的和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分

(3)允许同一表达式的后部,引用前面的子表达式。例如:1引用的是第一个带圆括号的子表达式。子表达式的位置实际是参与计数的左括号的位置

对正则表达式中的前面子表达式的引用,并不是指对子表达式的模式的引用,而指的是那个模式相匹配的文本的引用

可以用(?...)组成没有引用的分组。

表5:正则表达式的选择、分组和引用字符

字符  含义

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

(...)   组合,将几个项组合成一个单元,且这个单元可以产生一个引用。

(?...)   只组合,把项组合成一个单元,但不记忆与该组相匹配的字符。

     和第n个分组第一次匹配的字符相匹配,组索引是从左到右的左括号数。

6.指定匹配位置

表6:正则表达式中的锚字符

字符   含义

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

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

     匹配一个单词的边界。

B     匹配非单词边界的位置。

Q(?=p)  零宽正向先行断言,要求Q后面的字符都与p相匹配,但不能包括匹配p的那些字符。(断言不计入返回结果)

Q(?!p)   零宽负向先行断言,要求Q后面的字符不与p匹配。

(?<=p)Q  零宽正向后行断言,要求Q前面的字符与p相匹配。

(?<!p)Q  零宽负向后行断言,要求Q前面的字符不与p相匹配。

7.修饰符

表7:正则表达式修饰符

字符   含义

i    执行不区分大小写的匹配/

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

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

u    "Unicode"模式,用来处理大于uFFFF的Unicode字符。

y    与g修饰符类似,但是必须确保匹配从剩余字符串的第一个位置开始。(也叫做粘连sticky修饰符)

s   可以使.匹配任意单个字符(不加s的话.只能匹配除换行符和其它Unicode行终止符之外的任意字符),等价于[^]

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

String支持4种使用正则表达式的方法。

(1)search

参数是一个正则表达式。返回第一个与正则表达式匹配的子串的起始位置。如果找不到匹配的子串,它将返回-1。

search不支持全局搜索,会忽略正则表达式中的修饰符g。如果参数是字符串,则会首先转换为正则表达式。

(2)replace

第一个参数是正则表达式,第二个参数是要进行替换的字符串。

如果正则表达式中设置了全局修饰符g,则源字符串中的所有匹配的子串都将会被替换。如果没有设置修饰符g,则只替换所匹配的第一个子串。如果第一个参数是字符串,则会直接搜索,而不会转换为正则表达式。

替换字符串中出现$加数字,那么repalce将会用与指定的子表达式相匹配的文本来替换这两个字符。

例如:用中文半角引号来替换英文引号,并保持引号里面的内容不变

var reg = /"([^"]*)"/g
text.replace(reg, “$1”)

repalce方法的第二个参数可以是一个函数,可以动态的计算替换字符串。

(3)match

参数是一个正则表达式。返回一个由匹配结果组成的数组。如果正则表达式设置了全局修饰符g,则返回包含了所有匹配结果的数组。如果没有设置修饰符g,也会返回一个数组,数组的第一个元素是匹配的字符串,余下的元素是正则表达式用圆括号括起来的子表达式

a[n]存放的是$n的内容。此外返回数组还带有index和input属性。

(4)split

参数是一个正则表达式。返回用正则表达式分隔符分割字符串的子串数组。

9.RegExp对象

RegExp的属性:

(1)source:(String)正则表达式的文本。

(2)global:(Boolean)正则表达式是否包含修饰符g。只读。

(3)ignoreCase:(Boolean)正则表达式是否包含修饰符i。只读。

(4)multiline:(Boolean)正则表达式是否包含修饰符m。只读。

(5)lastIndex:(Number)整数,如果匹配模式带有g修饰符,存储字符串下一次检索的位置。读/写。

RegExp方法:

(1)exec()

参数是一个字符串。返回相同的数组(与match返回结果类似,但有修饰符g时不同)。如果正则表达式由修饰符g,则可以重复调用,从lastIndex位置开始检索。

(2)test()

参数是一个字符串。返回一个布尔值。

10.具名组匹配

(?<name>...)为每个引用指定一个名字。

可以在exec方法返回结果的groups属性上引用该组名

例如:

const re_date = /(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/
const res = re_date.exec('1900-10-12')
const year = res.groups.year // 1900
const month = res.groups.month // 10
const day = res.groups.day // 12
原文地址:https://www.cnblogs.com/zhoulixue/p/8877497.html