一、通配符
说正则表达式之前,先回顾一下通配符,很多人总是把正则表达式和通配符搞混。
通配符是一种特殊的语句,主要包含*和?号(还有{}^!),主要用来模糊搜索文件,使用它替代一个或多个真正的字符,尤其在不确定完整文件名时,用来匹配符合条件的文件。
* 代表任意多个任意字符,包括0个或多个
? 代表任意1个字符
[ ] 代表可匹配所有[ ]内包含的任意一个字符,这个符号在通配符和正则表达式里的用法一样
[123] 表示可以匹配到123这三个字符中任意一个
[1,2,3] 表示可以匹配到123和逗号这四个字符中任意一个
^和! 这两个符号往往和[ ]一起使用,代表取反,[^A]就是可以匹配非A的任意的任意一个字符
注意:
通配符(globbing)是用来匹配文件名的,既限定了字符也指定了范围
而正则表达式是和文本搜索工具一起使用用来匹配文本文件内的内容,一般以行为单位
二、正则表达式
1、概述
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为”神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为”正则集的代数”的表达式,因此采用”正则表达式”这个术语。
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
2、正则表达式分类
常见的正则表达式记法,其实都源于Perl,实际上,正则表达式从Perl衍生出一个显赫的流派,叫做PCRE(Perl Compatible Regular Expression),『/d』、『/w』、『/s』之类的记法,就是这个流派的特征。但是在PCRE之外,正则表达式还有其它流派,比如下面要介绍的POSIX规范的正则表达式。
POSIX的全称是Portable Operating System Interface for uniX,它由一系列规范构成,定义了UNIX操作系统应当支持的功能,所以“POSIX规范的正则表达式”其实只是“关于正则表达式的POSIX规范”。
它定义了BRE(Basic Regular Expression,基本型正则表达式)和ERE(Extended Regular Express,扩展型正则表达式)两大流派。
目前,正则表达式已经在很多软件中得到广泛的应用,包括 *nix(Linux, Unix等)、HP 等操作系统,PHP、C#、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。
比如:python提供了Perl 风格的正则表达式模式的re模块
3、正则表达式语法
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(例如字符 a 到 z,0到9)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号
元字符(特殊字符)
字符匹配
所谓元字符,就是一些有特殊含义的字符,许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符 (/) 放在它们前面。下表列出了正则表达式中的特殊字符:
元字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘/n’ 或 ‘/r’。要匹配 $ 字符本身,请使用 /$。 |
( )分组 | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 /( 和 /)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 /*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 /+。 |
. | 匹配除换行符 /n 之外的任何单字符。要匹配 . ,请使用 /. 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 /[。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 /?。 |
/ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’/n’ 匹配换行符。序列 ‘//’ 匹配 “/”,而 ‘/(‘ 则匹配 “(“。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 /^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 /{。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 /|。逐单词而不是逐字符 |
[] 匹配方括号内出现的任一字符,比如说单向选择题的答案,可能是ABCD选项中的任意一种,用正则表达式表示就是[ABCD],如果遇到比较大范围的匹配,就需要使用“-”号做范围限定如[a-z]表示所有的小写字母,一直要注意,这里“-”号不是单一个字符
[^] 指定范围外的任意单个字符
常用的字符集合:
[a-z] 所有小写字母;注意在文件名通配中是表示所有字母,包括大小写,在正则表达式中只表示小写
[A-Z],[0-9],[a-zA-Z0-9],[^a-zA-Z0-9],[a-z_/-]
[:lower:],[:upper:],[:alpha:][:digit:],[:alnum:]
[:punct:] 所有符号
[:space:] 所有空白字符,包括空格、制表符、换页符等等;等价于 [ /f/n/r/t/v],不包括空白行
/d:任意一个数字
/D:任意一个非数字
/w:匹配字母,数字和下划线,等价于[[:alnum:]_]
/W:匹配非字母、非数字、非下划线,等价于[^[:alnum:]_]
/s:匹配任何空白字符,包括空格、制表符、换页符等等;等价于 [ /f/n/r/t/v],不包括空白行,
/S:匹配任何非空白字符,等价于 [^ /f/n/r/t/v]
[/d],[/D],[/s],[/w]也是可以用的
限定符
次数匹配
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
正则表达式的限定符有:
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从”贪心”表达式转换为”非贪心”表达式或者最小匹配。
定位符
位置匹配
定位符使您能够将正则表达式固定到行首或行尾。这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,/b描述单词的前或后边界,/B表示非单词边界。
正则表达式的限定符有:
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 /n 或 /r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 /n 或 /r 之前的位置匹配。 |
/b或者/<,/> | 匹配一个字边界,即字与空格间的位置。 |
/B | 非字边界匹配。 |
注意:不能将限定符与定位点一起使用。由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 ‘/n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/183022.html