JavaScript进阶:正则表达式

来源:互联网 发布:大数据板块龙头股票 编辑:程序博客网 时间:2024/06/04 05:19

前言

这篇博客是我对正则表达式一些基础知识的整理。

基础部分

1.1 什么是正则表达式

是一种特殊的字符串模式

作用是匹配字符串

如同用模具做产品,正则表达式就是模具,具体的字符串就是产品

定义一种规则去匹配复合规则的字符串

1.2 元字符介绍

“^” :  ^会匹配行或者字符串的开头,有时会匹配整个文档的起始位置

“$”:  $匹配字符串的结尾。

“\b”:  单词的边界,如在字符串“i am a boy”,单独匹配单词“boy”需要“\bboy\b,

\b不会匹配boy两边的字符,但会识别boy两边是否为字符的边界。

“\d”:  匹配数字

“\w”:  匹配数字,字母和下划线

“\s”:   匹配空格

“.”:  匹配除了换行符以外的所有字符,相当于”\w”的加强版,”\w”不能匹配空格

“[abc]”:  匹配包含括号内元素的字符,只匹配括号内存在的字符

1.3 几种反义

“\W”: 匹配任意不是字母,数字,下划线的字符

“\S”:  匹配任意不是空白符的字符

“\D”:  匹配任意非数字的字符

“\B”:  匹配不是单词开头或结束的位置

[^abc]”:  匹配了除了abc以外的任意字符

1.4 量词

贪婪:如*”字符,贪婪量词会首先匹配整一个字符串,尝试匹配时,它会尽可能地匹配每一个字符,如果失败则回退(回溯)一个字符,直到找到可以匹配的字符或者没有字符可以回退。相比下面量词,它的消耗是最大的。

懒惰:如“?”它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,它会一直匹配到字符串结尾处。

*”: 重复零次或更多,例如“aaaab”匹配字符串中所有的a,正则:“a*

+”:重复一次或更多

“?”:重复零次或一次

{n}”:重复n次,例如从“aaaab”中匹配a并重复2次,正则:“a{2}

{nm}”:重复最少n次最多m

{n}”:重复n次或更多次,例如电话号码:0123-4567890,格式为0***-*******, 正则:“^0\d{3}-\d{7}$

1.5  懒惰限定符

*?”:重复任意次,但尽可能少,例如“aaaaab”正则:“a*?b”,原本可以取到全部的字符a,但因为尽可能少的匹配,所以最后得到“ab

+?”:重复一次以上,但尽可能少

“??”重复零次或一次,但尽可能少

{nm}”:重复n次到m次,但尽可能少

{n}”:重复n次以上,但尽可能少

进阶部分:

2.1 捕获分组

捕获数组:如(\d),可以对捕获分组进行向后引用,如(\d\d\1这里的“\1”就是对(“\d”)的后向引用。

下面为捕获分组常用的方法:

“(exp)”:匹配exp,并捕获文本到自动命名的组里

“(?<arrayName>exp)”:匹配exp,捕获文本到名为arrayName的组里

“(?:exp)”:匹配exp,不捕获文本,也不创建组

2.2 零宽断言

“(?=exp)”:也叫零宽正预测先行断言,匹配exp前面的文本,例如“how are you”,正则:“(?<txt>.+(?=ing))”,这里取ing前面所有的字符,并定义一个捕获分组,该分组名为txt,分组内的值是ing前面的字符。

“(?<=exp)”: 也叫零宽正回顾后发断言,匹配exp后面的文本:例如“how are you”,正则:“(?<txt>(?<=how).+)”,这里取how后面的所有字符,并定义一个捕获分组为txt

“(?!exp)”

2.3 负向零宽断言

(?!exp):后面跟不是exp的文本,例如“aaa123”正则:“aaa(?![1-9])”,匹配aaa后非数字的结果

(?!<exp):前面不是exp的文本