一 元字符 ^, $, ., \w, \s, \b, \d
1.后面四个有相应的大写,表反义。
^:匹配行开头,只有当其在“[ ]”中表示“非”
2.\b :匹配单词的开始或结束,而“.”匹配除换行符外的任意字符。
eg: ^.$:匹配一个非空行;
\bstr : 匹配str开头的字符串
二 重复 * , + , ? , { }
请叫上面四位为“四大金刚”~
* :0个或多个;
+ :1个或多个;
?:0个或1个;
{}有三种写法,{n},{n,}和{n,m},不赘述了~
注意:?在四种情况下为懒惰匹配
分别是在*,?,+,{}后面
eg:a.*b,匹配aabab,而a.*?b匹配aab和ab
三 “[]”表示字符类,就是里面只能选择其中的一个字符进行匹配
a[\w]c 可以匹配akc等;
A[\\w]c 可以匹配a\c或awc或akc等
“\\w”表示“\”和任意的单词(\w)
高级总结:
也就是说在“[]”内,“.” ,“*”,“?”和“{}”都表示本身,没有任何特殊的含义。因为“[]”里面是字符类啊!只能是一个个字符组成!像以上四种都不能惟一确定是一个字符(他们有的是0个或是多个),故在[]内表是本身,无特殊含义。然而,像\w,\d等,只能表示一个字符(如\d表示0~9中的任何一个数字),他们在[]中有着元字符本身的含义,而像前面所说的“四大金刚”都已蜕化成本身了~~
此外,“-”在“[]”中表示字符的范围,如[0-6]表示0~6的任意一个数字。
四 转义
一言以蔽之:“四大金刚”,外加一些特殊含义的字符如:^,$,{,(,\,|等。
因为他们有着特殊的含义,但是如果我就是要匹配他们自身呢?这时就要用到“\”了!
如“\\”匹配字符“\”
五 分支条件:“|”
匹配左侧或是右侧,首先匹配左侧,只有当左侧不匹配时才匹配右侧。
很简单的吧,你应该理解了~~那不举例子了哈
六 分组 “( )”
前面都是讲单个字符匹配(0次或多次),那么怎样才能匹配多个字符呢?
佛祖说:孩子,把这些多个字符用括号括起来吧~~
如:(\d{1,3}\.){3} 匹配“1~3个数字,并且重复3次”,31.23.432之类的
注意:这里再次说明“[]”与“( )”的区别,前者称为字符类,匹配其内的单个字符,侯泽华称为分组,匹配多个字符。前者只匹配[ ]中的一个!后者要匹配括号中的所有。因此,不能有[\d{3}(ab)?]之类的东西出现。
七 反向引用(后向引用)
用于重复搜索前面某个分组匹配的文本(该文本已被捕获,等待后面引用),组的序号或是名字标明,默认自动分配时按数字来标示,并且从1开始。
如:\b(\w+)\b\s+\1\b 可以匹配两个相同的单词的字符串,并且两个单词之间有一个或多个空格,如try try等
也可以自己指定组名(.NET Framework下支持)
格式:(?<组名>原有基础)或是(?’组名’原有基础)
对于自定义的组名要用 \k<组名>来引用。
如
1 :\b(\w)(\d)\1\2\b: 默认命名,可以匹配h1h1,但不能匹配h1d2,\1就是代表前面被(\w)捕获的内容!
2 :\b(?<name>\w+)\b\s+\k<name>\b ,在.NET Framework下支持
八 零宽断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,再读一遍上面的,我肯定你现在还没弄清楚,要不再读一遍。。。(别打我~)
1. (?=exp): 零宽度正预测先行断言(死去吧,这么难记住,不记了!算了,记一下吧,以后装逼。。)它断言自身出现的位置的后面能匹配表达式exp,然后整个(?=exp)就是个条件!只有满足这个条件才能进行匹配。
如: I like singing and dancing. \b\w+(?=ing\b)可以匹配sing和danc。注意,如果写成 \b\w+(?=ing)\b则没有匹配项。
再来理解一遍:(?=ing\b)表示的是在这个表达式的位置处应该是以“ing”结尾的单词。注意的是,整个(?=exp)没有代表任何东西!你要找以“ing”结尾的单词的前半部分,就要用\w+来匹配!
2. (?<=exp)表示自身位置的前面呗~(啥,你说你想知道它的名字。。受不了,它叫。。零宽度正回顾后发断言。。很好记吧)
如:(?<=\bwa)\w+\b I’m watching TV! 匹配ching
八.5 负向零宽度断言
和零宽度断言相对应,如果表示“没有exp”,则进行其前面或后面内容的匹配。
1. (?!exp) 如 \d{3}(?!\d) 匹配3个数字(条件是这3个数字后面不能是数字)
2. (?<!exp) 如 \b((?!abc)\w+\b 匹配不包含连续字符串abc的单词。
高级总结:八和八.5如何总结呢?
能 = ‚ 前面 <
ƒ 不能 ! ④ 后面 无
另外这四种前面都是以?开头的哦!
考考你,匹配该位置前面不能有数字咋写?
首先:?
其次:“前面”: <
再次:“不能有”: !
因此:....(?<!\d)...