正则表达式学习(二)

反义:

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

下面都是反义用法,都是基于前面基础上的。比如\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 ,这个表达式可以表示上面的go go或者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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值