反义:
反义,顾名思义就是和正常意思反着的。前面学习了许多规则,有没有想过有时候需要反过来,排除某些字符串。比如,不是数字的字符串,排除数字总比列出除掉数字的其他所有字符种类容易得多吧。
下面都是反义用法,都是基于前面基础上的。比如\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