之前看过一些关于正则表达式的知识,只是知道它的强大,可以用来匹配字符串,从而操作字符串,可以大量的节省时间,但总是不会应用,偶尔用下,还要这里那里翻资料,浪费大量的时间。所以现在我系统的学下关于正则表达式的知识,并且整理下来,希望可以加深对正则表达式的理解和应用。
正则表达式的内容太多,以后会慢慢更新,扩充教程内容。
有错误的地方欢迎大家指正。
一.普通字符。
普通字符就是我们经常使用的很平凡的字符,例如a, b, c这种单个字符,也包括连续的多个字符,例如abc, def.这些都属于普通字符。下面以举例的形式说明正则表达式的应用,本教程以后的说明都会以例子的形式来说明正则表达式的应用,采用的文本编辑器是Sublime Text3(这是一款很强大的文本编辑器,强烈推荐,这里就不说明这个是如何使用的了,有兴趣的朋友可以自行研究。)。下面直接看例子:
用sublime查找功能,勾选正则表达式选项。
image.png
可以看到输入a,字符串中所有a字母会高亮显示。
2.同样可以输入一串子字符串匹配:
image.png
k is正确匹配。 image.png
注意cat因为勾选了Case Sensitive,所以大小写也要完全匹配,cat不会匹配Cat.除非你把Case Sensitive去掉勾选。
二.特殊字符。
字符串匹配中往往会需要更强大的功能,所以正则表达式为我们提供了一些特殊字符:\ | ^ $ . ? * + ( ) [ {
下面会一一介绍这些特殊字符的含义及用法。
1>.\ 的用法
在正则表达式中,如果你想要像普通字符那样使用上面的特殊字符,必须在特殊字符前面加上,例如:
未加反斜杠\所以不会匹配
image.png
加上反斜杠\,匹配到正确的字符
image.png
反斜杠不应该用在普通字符的前面,例如:
“\d”并不会匹配“d”:
image.png
其实正则表达式“\d”是一个shorthand,会匹配0-9之间任意一个数字:
image.png
\w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]'。
\s 匹配任意的空白符
\b 匹配单词的开始或结束
\1和\2等类似反斜杠加上数字这种形式的特殊字符组和"()"配合使用,举例说明。假设正则表达式"(a)(b)\1\2",其中"\1"会匹配前面第一个括号包括的内容也就是"a","\2"会匹配第二个圆括号包括的内容即“b”,所以整体正则表达式就会匹配“abab”。
image.png
我们可以使用反斜杠加上数字这种形式完成一些大量简单的工作。例如有如下文本,我们需要将等号左右两边的字符串反过来,"a=b"变成"b=a",这时应该怎么做呢,如果有大量的需要替换,就很麻烦了。这时就需要用到正则表达式了。
image.png
sublimeText使用快捷键Ctrl+h.打开替换界面。键入以下内容。然后点击replace all替换所有按钮。
image.png
结果成功实现替换:
image.png
2>.|的用法
选择操作符。例如“abc|def”会匹配“abc”或者“def”.
image.png
3>.^的用法
这个与字符类配合使用构成反字符类,后面会介绍。
4>.0匹配正则表达式全部字符串
2匹配第二个括号中的内容
依次内推……
举例说明。如果你有如下字符串,并且想做如下转换,以“abc”为例,将其变为“a = abc”.所有其他字符串做同样操作。
你可以键入如下内容,进行查找并替换。
image.png
结果成功:
image.png
5>.点(.)操作符的用法
6>.?的用法
匹配前面字符0次或者1次。例如"a?b"会匹配“ab”或者“b”.
image.png
7>.的用法
匹配前面的字符0次或者多次。例如ab会匹配“b”,"ab","aab","aaab"等等。
8>.+的用法
匹配前面的字符1次或者多次。例如“a+b"会匹配"ab","aab","aaab"等,但不会匹配“b”.
image.png
9>.(的用法
与“)”配合使用,用来表示强结合的意思。
10>.)的用法
与“(”配合使用
11>.[的用法
与“]”配合使用表示,形成字符类,后面会介绍。
12>.{的用法
大部分支持正则表达式的编辑器,都将“{“视作普通字符,只有当“{”与“}”成对出现的情况下,“{}”这个会构成一个重复操作符,所以如果要匹配“{”这个,一般不需要在前面加反斜杠"".例如:
前面未加反斜杠,也能正确匹配:
image.png
当然加上反斜杠,编辑器也会正确匹配:
image.png
"a{3}"匹配"aaa":
image.png
"a{3,5}"匹配a重复最少3次,最多5次:
image.png
三.不可打印字符
1."\t"匹配一个tab字符( ASCII 0x09):
image.png
2."\n"匹配一个换行字符 (0x0A):
image.png
3.“\r”匹配回车字符(0x0D).
4.\v匹配垂直制表符。
还有很多我就不一一总结了。
四.正则表达式匹配遵循的原则。
1.正则表达式匹配总会优先最左边的匹配,即使后面会有更好的匹配。
这个是什么意思呢,下面我举个例子,例如一串字符串 He captured a catfish for his cat.,正则表达式字符“cat”,那么他会首先找到第15个字符开始的cat,也就是catfish中的子字符串cat,Regex Engine找到了第一个,那么他会很着急,并不会考虑后面会不会有更好的匹配,他会立刻向上级汇报,我找到了cat。并不会考虑目标的最后三个字符cat。
五.字符类(字符集)[]
使用字符类操作符“[]”,你可以告诉编辑器,你想要匹配字符类操作符中的某个单个字符,例如:
下面的正则表达式T[wW]J会匹配TwJ或者TWJ,并不会匹配TwWJ,TWWJ,TwwJ.
image.png
同时使用字符类时有一个小技巧,可以使用连字符(-),表示一串连续的数字或者字母,例如“[0-9]”会匹配0到9之间的任意一个数字。
“[a-c]”会匹配a到c其中的任意一个字母。
image.png
甚至可以使用多个连字符(-),例如[0-9a-fA-F],这个会匹配0到9之间的任意一个数字,或者a-f和A-F中的任意一个字母。
image.png
在大多数支持正则表达式的编辑器中,在字符类中会有特殊意思的只有这些字符:闭括号“]”,反斜杠"",插入符号“”.向前面讲述的特殊字符在字符类中都会失去特殊字符的意思,成为一个普通字符,例如"[*+]"只会匹配“*”和“+”。如果需要包括一个反斜杠(仅仅就是反斜杠的意思,而不会成为转义意思),你需要将其转义,在前面再加上一个反斜杠,就像这样"[\X]",这个会匹配“\”或者X。字符类中的连字符“-”,上面讲过,表示一些连续的字符。而字符类中的“”会构成反字符类,我会在下面为大家详细讲解。
字符类中的“”或者“\”不需要加上反斜杠进行转义。
image.png
需要注意当连字符紧跟在“[”后面或者在“]”前面,它就表示一个普通字符失去特殊的意思。“[3-]”和“[-3]”都表示匹配“-”或者“3”。
image.png
image.png
利用“?”,“”,“+”重复字符类。
如果你利用重复特殊字符,来重复一个字符类,你重复的实际是整个字符类。而不仅仅重复的是你匹配的字符。例如“[0-9]+"会匹配837,222,333.
image.png
六.反字符类(反字符集)
与字符类相反,正则表达式也提供了反字符类。只需要字符类“[]”的“[”后加上"”就可以了,即“[]”。下面用例子说明反字符类的用法。“[abc]”表示匹配一个不是a,b,c的任意一个字符。"[0-9a-c]"匹配非0-9和a-c的任意一个字符。
七.字符类的减法(Character class subtraction)
sublimeText不支持字符类的减法,支持字符类的减法有 XML Schema, XPath, .NET (version 2.0 及以后), 还有 JGsoft regex flavors.
上面说过当我们在“[]”里面使用“-”字符时表示连续的范围的意思。但是有个例外就是可以用来做字符类减法功能,当我们在“[]”使用“-”时,并且“-”后面跟着中括号,那么这里正则表达式引擎会将其解释成减法的作用而不是连续范围的意思。格式是这样的, [class-[subtract]]。
例如,"[0-9-[1-3]]"会匹配0456789中任意一个数字,而不会匹配1-3中的数字。
字符类减法也可以嵌套使用,例如"[0-9-[0-6-[0-3]]]"等价于"[0-9-[4-6]]",即会匹配0123789中的任意一个数字。
八.向前引用和向后引用
向前引用,又分为正向前引用和反向前引用。
正向前引用:如果你需要匹配一个字符,这个字符后面跟着某个字符或者某个字符串。你就需要用到正向前引用。正向前引用结构是“(?=这里是后面紧跟的字符或字符串)”。例如你想要匹配一个“q",这个“q”后面必须紧跟着“u”.
image.png
或者匹配一个“q”,这个“q”后面必须跟着uf。
image.png
反向前引用:与正向前引用相反,如果你需要匹配一个字符,这个字符后面不跟着某个字符或者某个字符串。反向前引用的结构是“(?!这里是后面不能跟着的字符或者字符串)”.例如你想要匹配一个“q”,这个“q”后面不能跟着“u”.
image.png
或者匹配一个“q”,这个“q”后面不能跟着“uf”。
image.png
向后引用与向前引用的作用类似,但是恰恰相反的是,查找一个字符,这个字符前面必须是或者不是某个字符或者字符串(分为正向后引用,反向后引用)。正向后引用的结构是“(?<=查找的字符前面必须跟着的字符或者字符串)”。例如你想要查找一个“q”,这个“q”前面必须跟着“u”.
image.png
例如你想查找一个字符“q”,这个“q”前面必须跟着“u”或者“j”.
image.png
反向后引用,用来查找一个字符,这个字符前面不能是某个字符或者某个字符串。结构是这样的“(?<!目标字符前面不能出现的字符或者字符串)”。例如你想要查找字符“q”,它的前面不能出现“u”.
image.png
网友评论