正则表达式总结

207 阅读4分钟

1、\d匹配0-9,\D匹配非0-9。

2、\w匹配a-z、A-Z、0-9、。\W匹配非配a-z、A-Z、0-9、

3、【.】匹配除了换行符的任意字符。

4、\s匹配空格(包括换行符,等价于[\f\n\r\t\v])。\S匹配非空格。

5、/g表示匹配完一个之后继续往后匹配。

6、/m表示把多行拆开来匹配,每一行分别执行正则匹配规则。

7、/i表示忽略大小写。

8、[]:原子表。表示匹配[]中的单个一个字符。例如:abc.match(/[ac]/),匹配到a。如果加上/g,则匹配到a后继续往后匹配,发现c也在[]中,则c也会被匹配到,匹配结果是0:a,1:c。[comnet]和(com|cn)匹配到的结果是不一样的。

9、\b是个例外,不属于\s也不属于\S。

10、/s修饰符可以让.匹配包含换行符的所有字符。

11、使用\p{属性分类}配合/u匹配以达到使用unicode匹配字符。

12、reg有lastIndex属性,当reg执行.exec()方法后lastIndex属性会发生变化,并且只有在/g全局模式下才会发生变化,不加/g的情况下每次exec后lastIndex都为0。可以手动更改lastindex让从指定位置开始匹配。

13、/y模式用于在连续匹配的情况下,即匹配重复的内容。eg:let str =abab,let reg=/a/y。dreg.exec(str),返回第一个a,reg.exec(str)返回null,如果str为aabb,则第二次调用则会返回第二个a。

14、\1的结果是引用第一个组匹配到的结果而不是第一个组的表达式。eg:/(\d)\1/.exec('12')结果为null,因为\1的结果为1而不是\d。效果和/y模式有点类似,不同的是/y是前一个字符和后一个字需要重复,而\1是前一组字符和后一组字符需要重复。\0代表匹配到的完整内容,类似$&。

15、():原子组。()放在[]中表示的就是普通括号字符,而不是原子组。.+等特殊匹配符也是同理。

16、reg的test和exec每次都执行一次匹配,如果想要全部匹配,首先得加上/g模式(加上这个的原因是因为系统化可以记住每次匹配后的lastindex),然后使用while循环执行exec或者test函数。

17、/y模式的作用是每次都从lastindex的位置开始匹配,如果匹配失败,则lastindex重制为0。

18、/g模式的作用是每次都从lastindex之后的位置开始匹配,中间可以跳过很多字浮。

19、string的match函数如果传入的reg对象如果带有/g模式,则会自动匹配所有的复合条件的内容,类似使用while循环的reg的exec,但是match只会匹配结果,不会包含原子组匹配的结果和lastindex等信息。如果传入的reg不带/g模式,则结果和执行reg执行一次exec没什么区别。

20、原子组中如果带有?:前缀,该作用是不记录原子组匹配到的结果。比如:abc123.match(/(\d)/),那么匹配到的结果中会包含\d匹配的结果1,如果加上?:,那么1则不会被记录到结果中。

21、str.replace()函数的第二个参数如果为函数时,那么该函数的参数如下:p0:完整匹配内容,p1:第一个原子组匹配内容,p2:第二个原子组匹配内容,依次排列。也可以在返回的字符串中使用11、2代替p2、p2。

22、禁止贪婪:在贪婪控制后面加上问号?,则表示往贪婪区间最小的方向匹配。例如:str=hdddd,reg=\d*?,匹配后,会得到结果h,因为*的区间为[0,+~]。\d+?匹配到的结果为hd。

\d{3,100}匹配hddd。注意:这里的禁止贪婪不是说固定取最小区间的值,其含义为尽可能短的匹配,当匹配到内容后就不往后继续匹配更多字符了。比如str=aabbccddeeff,reg=/[\s\S]+</span>/gi,那么匹配到的内容为aabbccddeeff,如果reg=/[\s\S]+?</span>/gi,那么匹配到的内容为aabbcc

23、string的replace可以使用正则,当第二个参数为string时,可以使用快捷指令:【&,,$'】,其中$&代表匹配到的内容,$代表匹配到的内容的前面的所有内容,$'代表匹配到的内容的后面的所有内容。

24、给原子组起别名:在原子组的括号内的前面加上【?<别名>】,使用的时候使用【<别名>】来引用该别名原子组匹配到的内容。egstr=123abc567,reg=/(?<string>[az]+)/string为该原子组的别名,在使用时:str.replace(reg,<别名>】来引用该别名原子组匹配到的内容。eg:str=123abc567,reg=/(?<string>[a-z]+)/,string为该原子组的别名,在使用时:str.replace(reg,'')可以引用该原子组匹配到的结果。当给原子组起别名后,str.match和reg.exec匹配的结果中的group字段会包含对应的信息。group的数据格式为:{别名1:别名1原子组匹配的结果,别名2:别名2原子组匹配到的结果,...}

25、断言匹配:在原子组的括号内前面加上【?=】,表示后面满足条件的才会匹配。比如:str=123abc456,reg=/a-z/,则匹配结果为c。可以把断言匹配理解为正则表达式的条件,只有后面满足条件的才会匹配到,类似sql中的where查询。多用于后面内容为某某某内容时的匹配。注意:该断言虽然放到原子组中了,但是只是表示条件,不会放到group信息中。

26、后置非断言:在原子组括号内前面加上【?!】,表示后面不是某某内容时才会匹配,并且该条件不会匹配内容,只用作条件筛选。该原子组不会加入到group信息中。

27、前置非断言:在原子组括号内前面加上【?<!】,表示前面不是某某内容时才会匹配,并且该条件不会匹配内容,只用作条件筛选。该原子组不会加入到group信息中。

28、\u模式:每个字符都有属性,如L属性表示是字母,P 表示标点符号,需要结合 u 模式才有效,同一符号可以拥有多种 Unicode 属性,属性则有 【binary 】("boolean-like") 和 【non-binary】 之分:

binary属性的字符的表达式可以直接写作【\p{Binary属性名}】,其中Binary的属性名有:参考文章

non-binary属性的字符的表达式可以写作【\p{Non-binary属性名=unicode属性值}】,Non-binary属性名有【General_Category(gc)、Script(sc)、Script_Extensions(scx)】。大多数Non-binary属性字符的值的 Unicode 属性名 和等号可以省去,此时会默认为\p{General_Category=属性值}。

至于\p{Binary属性名}和直接写\p{Non-binary属性值}这两种写法有点类似,但是效果却不同,浏览器底层会加以区分开来。