正则表达式学习(二)
反义: 反义,顾名思义就是和正常意思反着的。前面学习了许多规则,有没有想过有时候需要反过来,排除某些字符串。比如,不是数字的字符串,排除数字总比列出除掉数字的其他所有字符种类容易得多吧。 下面都是反义用法,都是基于前面基础上的。比如d表示0-9的数字,使用大写字符D是表示排除数字的字符。其他相似,用大写字符来表示反义。 D 排除所有数字 B 排除单词的开头和结尾的位置 S 排除所有空白位置(包括空格,制表符,换行符,中文全角空格) W 排除所有数字,字母,下划线,中文等四种中的任何一种 [^f] 排除f字符,也就是匹配f字符以外的所有字符, [^aeiou] 排除元音字符 <a[^<>]+>匹配尖括号括起来的以a开头的字符。 后向引用: 后向引用,从字面意思上来理解也就是从后面引用前面的内容。实际上也就是这样的。这里的引用场景为分组,一个分组可能在后面还可能会用到,这里说的用到,不是像之前说的IP地址那样,是三个连续的使用,使用{n}的方式就能重复。这里的重复是隔开的,中间有其他内容时的重复。 如go go,Kitty Kitty,这样的,重复,虽然是相同重复,但中间隔着空白符。 这样就是使用后向引用的时候了。 如上所说,后向引用用于分组。如b(w+)bs+1b,这个表达式可以表示上面的gogo或者Kitty Kitty这样的情况。(w+)是一个分组,后面用1再次使用。1代表分组的顺序为1。(至于为什么是1,而不是0,后面再解释) 给分组指定组名 如上面1,每个分组在一个正则表达式里面是有序号的,可能有时候数序号太麻烦或者会搞错,那自己指定一个分组名,就不会搞错了。 指定分组名,通过(?<word>w+)或者(?’word’w+)的方式指定,使用?加尖括号或者单引号指定分组名,如上,word就是分组名。 把上面的b(w+)bs+1b改写一下就是 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前面的位置。 如bw+(?=ingb) 匹配以ing结尾的单词,如beginning,dancing等前面部分,begin,danc。 (?<=exp) 匹配exp后面的位置。 如(?<=bre)w+ 匹配前面带re的单词的后面部分,如reback,匹配back部分。 而(?!exp)和(?<!exp)两个则跟上面两个相反,匹配的是前面或者后面跟的不是exp的位置。 注意:(?=exp),(?<=exp),(?!exp),(?<!exp)四个都属于断言类型,获取的是一个位置,而非字符串内容,它不占用字符,只是匹配得到一个位置。 例:如果我们要匹配一个单词,这个单词中要包含q同时q的后面不能是u。正则表达式怎么写? 常规想法: bw*q[^u]w*b,嗯,包含q排除u,看着没错,但是仔细一想,[^u]是样占用一个字符的啊,如果这个字符是个单词没事,要是个空格或者逗号之类的怎么办?如Iraq,Benq,这两个单词中间隔着一个逗号,想想上面的表达式,排除u就行,这个字符串也满足啊。所以这样不行。 这时,断言就能派上用场了,你不是只是想要一个包含q,且后面不能是u的单词吗,上面排除方法会占用一个字符位置,我改用断言匹配一个位置不就好了嘛。 改一下,就是 bw*q(?!u)w*b (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |