正则表达式学习(二)

前端之家收集整理的这篇文章主要介绍了正则表达式学习(二)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

反义:

反义,顾名思义就是和正常意思反着的。前面学习了许多规则,有没有想过有时候需要反过来,排除某些字符串。比如,不是数字的字符串,排除数字总比列出除掉数字的其他所有字符种类容易得多吧。

下面都是反义用法,都是基于前面基础上的。比如\d表示0-9的数字,使用大写字符\D是表示排除数字的字符。其他相似,用大写字符来表示反义。

\D 排除所有数字

\B 排除单词的开头和结尾的位置

\S 排除所有空白位置(包括空格,制表符,换行符,中文全角空格)

\W 排除所有数字,字母,下划线,中文等四种中的任何一种

[^f] 排除f字符,也就是匹配f字符以外的所有字符,

[^aeIoU] 排除元音字符

<a[^<>]+>匹配尖括号括起来的以a开头的字符。

后向引用:

后向引用,从字面意思上来理解也就是从后面引用前面的内容。实际上也就是这样的。这里的引用场景为分组,一个分组可能在后面还可能会用到,这里说的用到,不是像之前说的IP地址那样,是三个连续的使用,使用{n}的方式就能重复。这里的重复是隔开的,中间有其他内容时的重复。

如go go,Kitty Kitty,这样的,重复,虽然是相同重复,但中间隔着空白符。

这样就是使用后向引用的时候了。

如上所说,后向引用用于分组。如\b(\w+)\b\s+\1\b,这个表达式可以表示上面的gogo或者Kitty Kitty这样的情况。(\w+)是一个分组,后面用\1再次使用。\1代表分组的顺序为1。(至于为什么是1,而不是0,后面再解释)

给分组指定组名

如上面\1,每个分组在一个正则表达式里面是有序号的,可能有时候数序号太麻烦或者会搞错,那自己指定一个分组名,就不会搞错了。

指定分组名,通过(?<word>\w+)或者(?’word’\w+)的方式指定,使用?加尖括号或者单引号指定分组名,如上,word就是分组名。

把上面的\b(\w+)\b\s+\1\b改写一下就是

\b(?<word>\w+)\s+\k<word>\b

(注意:使用分组名时使用\k<word>的形式在后面引用。记得加上\k,同时分组名使用的符号应当和前面指定的相同)

分组顺序:

0代表整个表达式

分组分为两遍,第一遍给没有指定名字的分组分配组号,第二遍才是给有指定名字的分组分配组号。

常用分组用法

(exp)匹配exp,并捕获文本到自动分配的组里

(?<name>exp) 匹配exp,并捕获文本到name组里

(?:exp) 匹配exp,不捕获匹配的文本,也不给次分组分配组号。

(?=exp) 匹配exp前面的位置

(?<=exp) 匹配exp后面的位置

(?!exp) 匹配后面跟的不是exp的位置

(?<!exp) 匹配前面跟的不是exp的位置

(?#comenet) 注释,不匹配文本内容

解释:

(?=exp) 匹配exp前面的位置。

如\b\w+(?=ing\b) 匹配以ing结尾的单词,如beginning,dancing等前面部分,begin,danc。

(?<=exp) 匹配exp后面的位置。

如(?<=\bre)\w+ 匹配前面带re的单词的后面部分,如reback,匹配back部分。

而(?!exp)和(?<!exp)两个则跟上面两个相反,匹配的是前面或者后面跟的不是exp的位置。

注意:(?=exp),(?<=exp),(?!exp),(?<!exp)四个都属于断言类型,获取的是一个位置,而非字符串内容,它不占用字符,只是匹配得到一个位置。

例:如果我们要匹配一个单词,这个单词中要包含q同时q的后面不能是u。正则表达式怎么写?

常规想法: \b\w*q[^u]\w*\b,嗯,包含q排除u,看着没错,但是仔细一想,[^u]是样占用一个字符的啊,如果这个字符是个单词没事,要是个空格或者逗号之类的怎么办?如Iraq,Benq,这两个单词中间隔着一个逗号,想想上面的表达式,排除u就行,这个字符串也满足啊。所以这样不行。

这时,断言就能派上用场了,你不是只是想要一个包含q,且后面不能是u的单词吗,上面排除方法会占用一个字符位置,我改用断言匹配一个位置不就好了嘛。

改一下,就是 \b\w*q(?!u)\w*\b

原文链接:https://www.f2er.com/regex/360996.html

猜你在找的正则表达式相关文章