2015.11.12_正则表达式笔记

来源:互联网 发布:燕十八php教程怎么样 编辑:程序博客网 时间:2024/06/17 12:01

1.正则表达式入门

正则表达式是用来匹配文字的规则,所以它必定会有自己的语法。正则表达式的语法就体现在其对一些字符的特殊定义。
这些有特殊定义的字符是正则表达式的基础,它们叫元字符。以下是一些正则表达式字符:


\b: 表示一个边界。字符串的分隔符是空格标点符号或者换行。它并不匹配这些分隔符,二是匹配这种分隔符带来的分界效果。这个字符放在字符串的最前面,就表示一个字符串的开始,在这个字符串前面,是一个字符串的分隔符的话,那么就匹配成功。

b\b : 匹配其后面为一个字符边界的字符b
\bb : 匹配其前面为一个字符边界的字符b
\bb\b : 匹配其前面和后面均为字符边界的字符b


. : 点是另一个元字符。它可以匹配除了换行符意外的任意字符。注意,前面的一句话缩掉点信息,可以简称为:它匹配字符,意味着:它匹配的是单个的字符,虽然是任意的,但只能是单个的。在正则表达式的实现中,.也可以匹配到换行符。

比如:有这么一句话。对上面的一句话运用单个“ .”那么,上面这句话的每个字符都是匹配的结果。


* : 星号和一般用作通配符不同,在正则表达式中,它表示的不是字符(意味着它本身不匹配任何字符),不是位置,而是表示重复次数。星号起修饰说明左右,说明的对象是它前面的对象,在不出现组合的情况下,或者说它前面是字符的情况下,*号表示,为了正则表达式可以对目标字符串匹配成功,它前面的字符可以出现任意次,这个任意次,也表示0次。

如下的字符串: adbcedf
那么,如果正则表达式:ab*, 将可以匹配成功,匹配结果是a,因为b出现0次,就只有a,a可以在目标字符串中找到。

字符串: abbbbb
正则表达式: ab*,将可以匹配成功,匹配结果是abbbbb,也就是b出现5次。当使用*的时候,对于同一个位置的匹配,它匹配的结果,总是以最多出现次数的结果为准的。虽然,它可以匹配到a,ab,abb,abb,但是它以b出现最多次为匹配结果。
同理,abbbbbxdsdsab,匹配结果是: abbbbb和ab


将.和*联合使用,也就是.*,它们就可以匹配任意数量的不包括换行的字符串(能不能匹配到换行,看具体实现而定)。


\d : \d匹配一位数字,如果要匹配两位数字,那么就需要这么写:\d\d,如果是3个,就需要写\d3次。多少位,就需要写多少个\d。这么写很麻烦,所以就有了简写:\d{9},这里表示匹配连续的9个数字。{}这种写法,可以放在任何的字符和元字符的后面。它表示重复次数。比如:a{2},表示2要出现2次。


\s : 匹配任意的空白符,包括空格,制表符,换行符,中文全角空格等。


\w: 匹配字母数字下划线汉字。 再次说明,这些匹配字符的元字符,不加后缀说明的情况下,都是匹配一个字符。


+ : 前面*号表示出现任意次,包括0次,+号是另一个表示数量的东西,它表示1次或者多次,也就是说,+号表示它前面的字符至少要出现一次。


^ : 表示字符串的开始,它也表示一个位置。所以,使用它的时候,它必须要放在表达式的最前面。


$ : 表示字符串的结尾,它同样表示一个位置。
\b是用来匹配单词的开始的,在正则表达式中,单词的意思是:不少于一个的连续的\w
^和$的具体作用还取决于实现,在有些实现中,它有个开关,可以设置 ^$是匹配行的开始和结尾还是字符串的开始和结尾


关于重复的总结
现在已经有以下几种:

语法 说明 * 重复 0次到多次 + 重复1次或更多次 ? 重复0次或者1次 {n} 重复指定次数 {n,} 重复n次或者n次以上 {n,m} 重复n到m次

{}的形式,可以覆盖*+?这3种形式,可以说,这3种是{}的简便表示方式。


关于匹配字符的总结
.可以匹配任意字符,\s匹配任何空白字符,\w匹配非空白字符,\d匹配数字。这四种元字符实际代表的是四种字符类型,表示单个字符的类型。
那么,如果要匹配字母,则没有现成的字符类型,或者如果要匹配的是指定的字符集合,也没有现成的字符类型,这就需要自己制定字符集合。指定方法是使用[],把要匹配的字符放在其中。比如,要匹配abcd中的一个,则要这么写:

[abcd]

如果字母是连续的,那么可以这么写:

[a-z]

也就是说,可以用-来指定范围,比如要匹配全部的字母,则要这么写:

[a-zA-Z]

匹配的时候,是以最大化程度匹配。比如,有如下字符串:abceafafasfafAFAFAS
然后用[a-zA-Z],匹配,则匹配的结果是每个字符都能匹配上,每个字母都是一个匹配结果。
而如果使用[a-zA-Z]+匹配,则匹配结果是abceafafasfafAFAFAS。


匹配元字符本身
.*?这些元字符在正则表达式中直接出现的时候都有特殊意义,所以要把这些元字符当做普通的字符来匹配,就需要转移,转义符:\ 转义就是把\后面的字符的意义转回它原来表示的意义。\本身的转义是\\。


反义
反义,可以把所有的字符看出一个集合,每种元字符都表示其中的一部分类型。而反义,就是让这些元字符,不再表示是原来表示的类型,而是反过来表示其原来不包含的部分。
反义的符号是: ^
比如:[^\d],会匹配除数字外的任何字符:

1dgh2s3sd
sf
s

会匹配每个字符,包括换行符。
这里写图片描述
注意,这里的[^\d]要加中括号,否则表示:前面是字符串开始的那个数字。实际上,为了匹配非数字字符,正则表达式中有一个专门的元字符:\D
同样地,匹配空格外的所有字符用:\S
匹配所有不是字母,数字,下划线,汉字的字符用:\W
匹配所有不是单词开头或结尾的位置,用\B
还可以匹配指定字符外的所有字符:[^x] 这将匹配所有x字符外的字符。
匹配指定字符外的其他所有字符:[^abce]
例:
\S+匹配不包含空白符的字符串。
1dgh2s3sd adf匹配结果是:1dgh2s3sd和adf。因为它不匹配空格,所以在有空格的地方匹配不成功,就把字符串截断了。
<a[^>]+\> 匹配用尖括号括起来的以a开头的字符串。
这里a后面的[^>]+是必须的,[^>]用来表示除>的字符,+表示可以出现1次或多次。
[^abc]这表示,匹配除了a、b、c之外的所有字符,在这里要特别注意语法。
^和要排除的字符,都要放在[]中,并且,^后的部分,都是一个整体,而不是仅排除a。


分支
分支符号是:|
它的前面和后面都是一个正则表达式,只要这2个其中一个匹配成功就算匹配上了。
在有多个分支的时候,将会从地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。



后向引用



零宽断言



Java中使用正则表达式:

String content = excel_item.getContent();Pattern pattern = Pattern.compile("(?<=<img src=\").*(?=\")");Matcher matcher = pattern.matcher(content);while(matcher.find()) {    String group = matcher.group(0);}
0 0
原创粉丝点击