正则表达式

JavaScript 正则表达式(慕课网)

正则表达式定义


正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则字符串。即正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来匹配一系列符合某个句法规则的字符串。【1.首先,正则表达式是单个字符串,这个字符串是由字符和元字符组成的、具有句法规则的单个字符串;2.这里的字符串(标蓝色),是指这个单个字符串对应的最小维度的字符串。例如  str="woshizhongguoren"  reg=/o/g  str.match(reg)的结果为[o,o,o];即“o”,“o',"o".而不是普通字符串str。3.普通字符串.math(单个字符串):单个字符串对应的字符串,如果普通字符串中包含字符串,则match的结果为字符串,否则为null.再例如:str="come on!";reg="/^come/g";reg单个字符串对应的字符串为come并且首字母是c的字符串,那么检索普通字符串str的时候,用单个字符串对应的字符串即"come"去匹配,在str中能匹配到这个字符串,故而match的结果为"come"】

正则表达式单个字符串规则: 

语法:/pattern/modifiers;

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。

  • 普通字符:需要搜索的字符,比如is,w3cshoole等等。除了元字符之外的字符;
  • 特殊字符:

       所谓特殊字符,就是一些有特殊含义的字符。这些字符并不会成为单个字符串对应的字符串的组成,只是表达单个字符串对应的字符串应该具备什么特征。                   

                     定位符

$

匹配输入字符串结尾位置。这里的输入字符串就是要匹配的普通字符串。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。例如 str=”woshizhongguoren nn“  reg=/n$/g  str.match(reg)结果为[n];str.replace(reg,"y") ,结果为:woshizhongguoren ny.

解析:/n$/g  $特殊字符代表的含义是普通字符串的结束位置,切记并不是结束字符.

修改上例reg=/$/g,match的结果为[''];str.replace(/$/g,'Y')  结果为:"woshizhongguoren nnY"。这里的结束位置是隐形的位置,即普通字符串最后一个字符后面的位置。一把不会直接/$/g,因为$只是代表一个位置,其并不是单个字符串对应的字符串。

因此/n$/对应的字符串就是普通字符串最后一个字符是n即最后位置是n的字符串。切记,$是结束位置,普通字符串的结束位置,仅此而已,不是字符串,因此,在单个字符串对应的字符串中,找不到任何关于$的痕迹。因此,"woshizhongguoren nn".match(/n$/g) 的结果为最后一个n.     

^

匹配输入字符串开始位置,除非在方括号表达式中使用,此时它表示不包含该字符集合(即“非”)。这里的输入字符串就是要匹配的普通字符串。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。例如:str="woshizhongguoren www w" reg=/^w/g;str.match(reg) 的结果为['w']即普通字符串str的开头w.

解析:/^w/g   ^特殊字符代表的含义:/^w/对应的字符串为即“w”并且这个“w”为第一个字符即”第一个字符为”w“的字符串。那么用这个规则去匹配一些普通字符串则,则这些普通字符串的首字符若和规则对应的字符串相匹配,则match的结果为"w"否则为null

\b

匹配一个字边界。\b 是正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是 \b 并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w。

什么是位置

 

It's a nice day today.

 

'I' 占一个位置,'t' 占一个位置,所有的单个字符(包括不可见的空白字符)都会占一个位置,这样的位置我给它取个名字叫“显式位置”。

 

注意:字符与字符之间还有一个位置,例如 'I' 和 't' 之间就有一个位置(没有任何东西),这样的位置我给它取个名字叫“隐式位置”。

 

“隐式位置”就是 \b 的关键!通俗的理解,\b 就是“隐式位置”。

 

此时,再来理解一下这句话:

 

如果需要更精确的说法,\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w。

 

我用我的话来翻译一下这句话:

 

“隐式位置” \b,匹配这样的位置:它的前一个“显式位置”字符和后一个“显式位置”字符不全是 \w。

 

解析:就用 "It's a nice day today." 举例说明:reg=/\bnice\b/;

正则是单个字符串,上述这个单个字符串对应的字符串必定是nice,但是这个nice字符串需要具备某种特征:

\bn规则对应怎样的一个n字符串呢?就是n其前面是非\w的字符串n;e\b规则对应怎样的一个e字符串呢?就是e后面是非e的字符串。 故而\bnice\b匹配的字符串nice是该字符串的前面为非\w,后面也是非\w,从而"It's a nice day today.".match(reg)的结果为前后都有空格的nice

参考文献:https://www.cnblogs.com/tnt-33/p/10676473.html

\B 非字边界匹配。刚好和\b相反

                  其他字符              

() 标记一个子表达式的开始和结束位置。 将(和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。简单来说,分组指匹配若⼲个连续字符:[a-z]只能匹配a-z中的⼀个字符,但(abcedfg)能匹配到字符串"abcedfg"。
例如:

 

[]

一个字符集合。匹配方括号的中任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。例如[a-zA-Z0-9_]即\w表示匹配大小写字母,数字和下划线中的任意一个字符。即这个单个字符对应的字符串就是a-zA-Z0-9或者_中的一个字符的字符串。

例如:str ="Love You 521"  reg=/[a-z]/g;这个单个字符串对应的字符串为'a','b', 'c','d','e','f',...'z'; 在str中,全局匹配(g)即匹配单子字符串多次,在str普通字符串中匹配单字符串对应的字符串,故而match的结果为:['o','v','e','o','u'];

.                         

| 指明两项之间的一个选择。两个匹配条件进行逻辑“或”(or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。“| ” 他的意思就是 “或 ” 。 用它我们可以把不同的 子表达式 合成一个总表达式,而这个总的表达式可以匹配 任意一个 的子表达式。

子表达式:表达式中被 “| ” 分格开的部分。如图 中的 “Back ” 、 “Go ” 和 “Do ” 就分别是一个子表达式。(这里对子表达方式的定义只是适用于多选结构)

任意一个:表示该表达式可以匹配上例中的 “Back ” 、 “Go ” 或 “Do ” 中的任何但是只能是一个 。 也就是说他不能匹配 “BackDo ” 或 “GoDo ” 这样的字符串。

例如str =" Back Go Home To Do Something";reg=/Back|Go|Do/g;

解析:单个字符串对应的字符串为"Back"或"Go"或"Do"。即这个单个字符串对应用|分隔开的三个句法规则,每个句法规则对应不同的字符串。并且,单个字符串每次匹配只能使用其中一个规则匹配其对应的字符串。如上例,第一个|前面的句法规则对应的字符串为"Back",两个|之间的句法规则对应的字符串为"Go",最后一个句法规则对应的字符串为"Do"。又因为g,即全局匹配,因此开始以第一个规则对应的字符串进行匹配,故而匹配到”Back“,继续扫描普通字符串str,第一个规则对应字符串找不到,故而匹配第二个句法对应的字符串,可以匹配到Go;继续扫描普通字符串str,第一个规则对应字符串找不到,第二个规则对应字符串找不到,第三个句法规则对应字符串找不到,继续扫描,知道Do的时候,第三个句法规则对应的字符串,可以匹配到Do,继续扫描...故而最后match的结果为['Back','Go','Do'].

|本质和[]一样,只不过[]针对单个字符,而|可以是多个字符串。即[2345]即对应字符串为2或3或4或5;23|45即对应的字符串为23或45

                           

. 匹配除换行符 \n 之外的任何单字符。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。

                               

                       限定符即量词(贪婪模式:尽可能多的匹配)

                  

* 匹配前面的子表达式零次或多次。*等价于{0,}。例如:

即/a*/g对应的字符串为:a、aa、aaa、aaaa、aaaaaaa......

*是贪婪模式即去匹配一个普通字符串的时候,会首先用单个字符串对应字符串数组中最后的字符串去匹配,如果匹配不到则使用倒数第二个,依次类推。例如:str="wo shi a ge aaaaa aa a aaaaaaaaaa",那么str.match的结果应该是什么呢?因此*是贪婪模式,因此,其会拿对应字符串组成的数组的最后的先匹配,即aaaaaaa...,匹配不到,那么就会以倒数第二...,直到a,才匹配到wo shi a中的a,又因为g,故而继续匹配,仍旧还是以最后的去匹配,直到aaaaa,和str中的aaaaa匹配;继续匹配,用aa和str中的aa匹配;.....

即永远都是用字符串组成的数组中的最后的去先匹配,匹配不到,用次之,依次进行,直到匹配到。其实可以理解,不然全部都用字符串组成的数组中的首个元素匹配即a,匹配的结果都是[a,a,a,a,...],匹配不到aa或者aaa,...字符串。

疑惑:匹配零次,不是很懂

 

+

匹配前面的子表达式一次或多次。+等价于{1,}。

例如:/a+/g对应的字符串为a,aa,aaa,aaaa,aaaaa,aaaaaa,aaaaaaa,aaaaaaaa,aaaaaaaaa,aaaaaaaaaa,...

+同样是贪婪模式即去匹配一个普通字符串的时候,会首先用单个字符串对应字符串数组中最后的字符串即aaaaaaaaaa...去匹配,如果匹配不到则使用倒数第二个,依次类推。例如:str="wo shi a ge aaaaa aa a aaaaaaaaaa",那么str.match的结果应该是什么呢?因此+是贪婪模式,因此,其会拿对应字符串组成的数组的最后的先匹配,即aaaaaaa...,匹配不到,那么就会以倒数第二...,直到a,才匹配到wo shi a中的a,又因为g,故而继续匹配,仍旧还是以最后的去匹配,直到aaaaa,和str中的aaaaa匹配;继续匹配,用aa和str中的aa匹配;.....

                        

? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。

 

{n}

n 是一个非负整数。匹配确定的 n 次。                                                                                                                                               

 

{n,} n 是一个非负整数。至少匹配n 次。例如:{1,}等价于+;/a{1,}/这个单个字符串对应的字符串:a,aa,aaa,aaaa,aaaaa,aaaaa...                                                                                                                                              
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如reg=/a{3,5}/这个单个字符串对应的字符串为:aaa,aaaa,aaaaa.在检索去匹配普通字符串的时候,同样是贪婪模式,即先让aaaaa字符串去检索普通字符串,如果没有匹配到,则aaaa去匹配;没有匹配到,则aaa去匹配

                     这些贪婪模式的限定字符后面跟一个?,则会变成非贪婪模式。即前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,在一个量词后面加?号使其变成惰性匹配即尽可能少的匹配。

                     同样,以上面的例子为例,/a+?/g对应的字符串仍然为:a,aa,aaa,aaaa,aaaaa,aaaaaa,aaaaaaa,aaaaaaaa,aaaaaaaaa...。在普通字符串中检索时,先会以字符串数组最前面的字符串“a”进行检索,没有检索到;则以"aa"进行检索,没有检索到,则以"aaa"以此类推。这也表明如果普通字符串中存在"a",则所有的匹配结果中都是"a"。

                                      

                   其他字符

字符描述
\d 匹配一个数字。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\w 匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-z0-9_]。
\W 匹配一个非单字字符。等价于[^A-Za-z0-9_]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

                     

                  修饰符(添加在最后)

字符描述
/i 忽略大小写
/g 全文查找出现的所有匹配字符
/m 多行查找
/gi 全文查找、忽略大小写
/ig 全文查找、忽略大小写

 

                     (?:pattern) 匹配结果。Java(?:6|7),表示单个字符串对应的字符串"Java"这个字符串是有特点的字符串即这是一个后面紧跟着6或者7的字符串(Java)。注意,这里的6和7都不会出现在字符中。
  •             (?=pattern) 正向匹配。Java(?=6),匹配后面跟着6的Java。这个单个字符串对应的字符串仍然为“Java”,这个字符串的特点是:这个字符串是一个后面必须跟着6的普通字符串才能匹配到。

    •   (?!pattern) 正向不匹配。Java(?!6),匹配后面不跟着6的Java,即第二个Java,结果Java

2、反向预查

  •            (?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a

                    (?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a
 
            常用方法:
  • test – 用来测试字符串是否匹配相应的正则规则,返回boolean;

  • exec – 返回包含第一个匹配的数组

  • match – 返回所有匹配的数组

  • replace – 完成字符串中匹配值的指定替换,返回替换后的字符串

  • search – 类似于indexOf的用法,不过search支持正则,返回第一个匹配值的index

  • split – 根据规则拆分字符串,返回被拆分后的字符串数组

        正则表达式实例使用     

 

 

                

posted @ 2017-08-16 08:51  ccfyyn  阅读(246)  评论(0编辑  收藏  举报