1.匹配单个字符

1)匹配纯文本(区分大小写)

2)匹配任意字符:英文点号”.”

3)在正则表达式里,有特殊含义的字符,都要以用”\”做转义,比如要匹配”.”,则要写成”\.”

2.匹配一组字符

1)匹配多个字符中的一个:”[]”,中括号定义一个字符集合,匹配字符集合中的任一个字符,例:[Rr]可以匹配red和Red中的r和R

2)利用字符集合区间:可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字;注意:在区间之间的的”-”不会匹配字符”-”,但不是在区间的”-”则可以匹配,例:[0-9]不会匹配”-”,但[-9]可以匹配”-”和9

3)取非匹配:用字符”^”表示取非匹配,例:[^R]ed可以匹配red而不能匹配Red

.使用元字符

1)因为元字符本身在正则表达式里有特殊的含义,所以要匹配元字符,就要对元字符进行转义,告诉系统我就要匹配元字符本身,例:”\[.\]”可以匹配”[R]”而””[.]”则不能匹配

2)匹配空白字符:

 

lua 正则匹配某个字符串开头 正则匹配指定字符_元字符

\r\n是Windows所用的文本行结束标签

3)匹配数字与非数字:

lua 正则匹配某个字符串开头 正则匹配指定字符_字符串_02

4)匹配数字和字母

lua 正则匹配某个字符串开头 正则匹配指定字符_元字符_03

\w:匹配字母或数字或下划线或汉字,即能组成单词的字符

\W:非\w ,等同于[^\w]

5)匹配空白字符

lua 正则匹配某个字符串开头 正则匹配指定字符_正则表达式_04

5.重复匹配

1)匹配一个或多个字符:想要匹配同一个字符(或字符集合)的多次重复,只要在这个字符(或字符集合)加上一个+号作为后缀就行了,+号匹配一个或多个字符(至少一个),比如,A匹配A本身,A+则匹配AA,AAA,AAAA…,[0-9]+匹配一个或一个以上连续的数字.

2)匹配零个或多个字符:+号匹配一个或多个,*号匹配零个或多个字符(包含零个),例:A[0-9]*匹配A,A1,A12,A123…,而A[0-9]+则不匹配A

3)匹配零个或一个字符:?只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次,如果需要在一段文本里匹配某个特字字符(或字符集合),而该字符可能出殃,也可能不出现,?是最佳选择,例:AB?可以匹配A,AB

4)匹配重复次数:重复次数用{}来字义重复区间:

{n}重复n次,例:A{3}匹配AAA,而不匹配AA或AAAA

{2,4}最少重复2次,最多重复4次,例:A{2,4}匹配AA,AAA,AAAA,不匹配A,AAAAA(这里可以部份匹配)

{2,}至少匹配2次,最高没上限.

5)贪婪模式和懒惰模式:*,+,{n,}的匹配都没有上限,这三个默认为贪婪模式,即尽可能多的匹配,例:A[0-9]{2,}对A2578631,会匹配成A2578631,这里最少匹配两个数字,但是它非常贪婪,把后面的数字都匹配进来了,*和+也一样,都尽量往多里匹配,当在后面加上?号,则是这几个表达式的懒惰版本,例:A[0-9]{2,}?对A2578631,则匹配A25,因为它已经变懒了,尽可能少的匹配,A[0-9]+匹配A2,A[0-9]*匹配A

.位置匹配

1)单语边界:\b用来匹配一个单语的开始或结尾,例:

文本:The cat scattered his food all over the room.表达式:cat,这样就把cat和scattered里的cat都匹配出来了,\bcat\b则只匹配cat而不匹配scattered里的cat

lua 正则匹配某个字符串开头 正则匹配指定字符_正则表达式_05

如果不匹配一个单语的边界,则用\B

2 )字符串边界:^定义字符串的开头,$定义字符串的结尾,例:^A[0-9]+B$可心匹配A43B,而不能匹配CA43BC,因他CA43BC不是以A开头B结尾的

7.使用子表达式

1)子表达式用”()”括起来,把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当作一个独立元素来使用.例:(AB)+可匹配AB,ABAB,ABABAB…因为AB两个字符被划分为一个子表达式,那么AB就会被看做是一个整体,这个表达式的意思就是AB这个组合至少出现一次

2)子表达式改变优先级别:我们要匹配一个年份,如1998,表达式19|20\d{2},本意是19或20开头的4位数,但实际匹配结果是19或20\d{2},这不是我们想要的结果,因为或运算符优先级别比较低,我们需要用子表达式来改变优先级别,(19|20)\d{2},这样就能得到想要的结果.

3)子表达式的嵌套:当然,子表达式也可以嵌套,例:((AB)|(CD))可以匹配AB或BC

.回溯引用:前后一致匹配

1)回溯引用的作用:比如要匹配HTML里的所有标题,有1-6级的标题,表达式为<[hH][1-6]>.*?</[Hh][1-6]>,正常的标题都可以匹配,但如果HTML里有行这样的字符:<h1>aa<h2>,这不是正确的标题,但也匹配上了,出现这种情况的原因是这个表达式的用来匹配结束标签的部份对匹配开始标签的部份毫无所知,要解决这个问题,就要用到回溯引用.

2)回溯引用匹配:回溯引用允许正则表达式模式引用前面匹配的结果,<[hH]([1-6])>.*?</[Hh]\1>只能匹配<h1>sdf</h1>,而不能匹配<h1>sdf</h2>,\1代表了表达式里的第一个子表达式,\2代表第二个表达式,依次类推,\1将引用第一个表达式匹配的结果

3)回溯引用在替换操作中的应用:例:字符串Hello,Ben@forta.com is my email address.要把其中的email地址替换成超链接,表达式:(\w+[\w\.]*@[\w\.]+\.\w+),替换:<A HERF="mailto:$1">$1</A>,结果:Hello,  <A HERF="mailto:Ben@forta.com">Ben@forta.com</A> is my email address.,

替换操作需要用到两个表达式:一个用来结出搜索模式,另一个用来给出匹配文本的替换模式.回溯引用可以跨模式使用,在第一个模式里被匹配的子表达式可以用在第二个模式里.

9.前后查找

1)前后查找:有时候,我们并不想返回匹配的本身,而是用于确定正确的位置,例:单价:$100,需要返回单价,\$[\d]+可以返回$100,但我并不需要返回$,只需要返回$后面的数字

2)向关查找:向前查找指定了一个必须匹配但不在结果中返回的模式,向前查找实际就是一个子表达式,一个向前查找模式其实就是一个以?=开头的子表达式,需要匹配的文本跟在=的后面.例:字符串: http://www.forta.com/,表达式:.+(:),匹配的http:,但有时候我并不想返回”:”,只想返回”:”前面的协议,就需要使用向前匹配:.+(?=:),返回匹配:http

3)向后查找:和向前查找相反,用?<=表示,例:单价:$100,(?<=\$)[\w]+就可以匹配100,不返回$

4)对前后查找取非:

lua 正则匹配某个字符串开头 正则匹配指定字符_字符串_06

把正向前后查找的表达式中的=换在!则为负向前后查找,例:有字符串:I paid $30 for 100 apples,我只查找数量而不查找价格,\b(?<!\$)\d+可匹配100,而不会匹配30,负向关查找相似

10.正则表达式里的条件

1)回溯引用条件:回溯引用条件只在一个前面的子表达式搜索取得成功的情况下才允许使用一个表达式,语法:(?(回溯表达式)成功后匹配执行的子表达式),例:表达式:(<A>)?.*(?(1)</A>)可以匹配<A>DSDF</A>,也可以匹配DSFS,解释:子表达式(<A>)出现一次或零次,即出现或不出现,(?(1)</A>)中,(1)是回溯引用,这里不需要转义,在C#中,转义也可以,(?(1)</A>)表示回溯引用1匹配成功,则执行后面的表达式</A>,否则不执行.

回溯引用还可以定义否则表达式,即回溯引用匹配成功,则执行表达式A,否则执行表达式B,语法:(?(回溯表达式)A|B),例:表达式(<A>)?.*(?(1)</A>|B),可以匹配<A>DSDF</A>,但不可以匹配DSFS,因为DSFS中?(1)不能匹配成功,所以需要匹配B,DSFSB则能匹配成功.

2)前后查找条件:前后查找条件中在一个向前查找或向后查找操作取得成功的情况下才允许一个表达式被使用,定义一个前后查找条件的语法与定义一个回溯引用条件的语法大同小异,只需把回溯引用替换为一个完整的前后查找表达式就行了.例:\d{5}(?(?=-)-\d{4}|b),可以匹配11111b和11111-1111,但不能匹配11111和11111-,即如果匹配-成功, 则使用表达式-\d{4},否则使用表达式b