正则表达式 入门 -- 简单字符匹配、元字符

来源:互联网 发布:mysql中references 编辑:程序博客网 时间:2024/06/05 23:09

好的工具可以提高工作效率,正则表达式绝对是这其中一员。最近抽时间大概了解了一下这方面的知识,整理了一下自己的一些笔记,文中示例通过vim编辑器来演示,匹配到的字符为黄色高亮显示,并在下面注明了显示结果。


首先,正则表达式的定义:一些用来匹配和处理文本的字符串

主要用途:搜索,替换


在正式开始之前,有一点需要特别强调:正则表达式的语法很容易掌握,但是真正的挑战是如何运用那些语法把实际问题分解为一系列正则表达式并最终解决,必须通过自己多多实践才能掌握。


1. 匹配单个字符

下面一个示例就是普通的文本匹配,我在vim中默认大小写敏感,这样我们可以观察正则表达式的表现。事实证明,正则表达式是大小写敏感的。


上面例子中,第1  4两行是高亮的,显示效果不太好,将就看下吧。


下面示例一个通配符'.'的用法

.字符(英文符号)可以匹配任何一个单一的字符、字母、数字、甚至是.本身。但是在绝大多数的正则表达式实现里,不能匹配换行符。

上面例子中,只有第4行是高亮的。


在同一个正则表达式中,允许使用多个.字符,可以连续,也可以间隔出现。

\. \是转义字符,\.意思是匹配.本身,而不是任意字符

上面例子中,第1  3两行是高亮的。


2. 匹配一组字符

这个主要通过字符集的方式来实现。用[]来定义一个字符集

字符集只能匹配特定的字符和字符区间

字符集的匹配结果是:能够与该字符集中的任何一个成员相匹配的文本

字符区间用'-'来定义,例如[0-9],表示0,1,2,。。。9 10个阿拉伯数字

常用字符区间有[a-z], [A-Z], [0-9]。但是[A-z]不常用,因为它除了包含26个英文字母的大小写,还包括[  ^等在ASCII字符表中排列在Z和a之间的字符。如果想匹配26个英文字母的大小写,那么可以用[a-zA-Z]这样的形式。


上面的例子中,可以看到前两行是高亮的

'-'是一个特殊的元字符,用在[]中,作为元字符,在其他地方,只是一个普通的字符,只能与本身匹配,并且不需要转义


取非匹配:^, [^0-9], ^的效果作用于给定字符集合中的所有字符或字符区间,而不仅限于在^字符后面的那一个字符或字符区间。


上面例子中,只有第4行是高亮的。


3. 元字符

其实上面已经提到这个概念了,用在[]中的'-'是元字符。

元字符要匹配本身的话,需要用\来进行转义。

空白元字符:

[\b] 回退(并删除)一个字符(backspace键)
\f   换页符
\n   换行符
\r   回车符
\t   制表符(Tab键)
\v   垂直制表符


\s   任何一个空白字符,等价于[\f\n\r\t\v]
\S   任何一个非空白字符,等价于[^\f\n\r\t\v]   注意:[\b]不包含在内


首先,在vim中使用:set list命令来使空白字符显示出来,


可以看到所有的$都高亮了。

btw,试了一下\s,好像vim的正则实现不支持这个。


数字元字符:

\d   任何一个数字字符,等价于[0-9]
\D   任何一个非数字字符,等价于[^0-9]


前3行中的几个数字都高亮了。

字母数字元字符

常用于匹配各种名字(如文件名,子目录名,变量名,数据库对象名等等)
\w   任何一个字母数字字符(大小写均可)或下划线字符,等价于[a-zA-Z0-9_]

\W   任何一个非字母数字或下划线字符,等价于[^a-zA-Z0-9_]


根据字符的16进制表示来匹配
16进制:\x0a == \n,ascii字符10
8进制: \012 等价于上面


这个在vim中不支持,试了一下不行。


POSIX字符类:

[:alnum:]    任何一个字母或数字,等价于[a-zA-Z0-9]
[:alpha:]    任何一个字母,等价于[a-zA-Z]
[:blank:]    空格或制表符,等价于[\t ]
[:cntrl:]    ASCII控制字符(ASCII0-31,再加上ASCII127)
[:digit:]    任何一个数字,等价于[0-9]
[:graph:]    跟[:print:]一样,但不包括空格
[:lower:]    任何一个小写字母,等价于[a-z]
[:print:]    任何一个可打印字符
[:punct:]    既不属于[:alnum:],也不属于[:cntrl:]的任何一个字符
[:space:]    任何一个空白字符,包括空格,等价于[\f\n\r\t\v ]
[:upper:]    任何一个大写字母,等价于[A-Z]
[:xdigit:]   任何一个16进制数字,等价于[a-fA-F0-9]

使用时注意[0-9] == [[:digit:]],POSIX字符类,必须是[[ ]] 括起来的。


这个结果跟上面的那个用\d的效果一样,也是前3行的数字都高亮了。


本篇文章,就简单地先介绍一下正则表达式的简单应用,改天再写一篇进阶版。


水平有限,如果有朋友发现错误,欢迎留言交流