一、什么是正则表达式?
正则表达式又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、 替换那些符合某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 UNIX 中的工具软件(例如sed
和grep
)普及开的。正则表达式通常缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。
1. 正则表达式的组成
正则表达式是由一串字符和元字符构成的字符串
(1).一般字符:没有特殊意义的字符
(2).特殊字符(meta字符):元字符,有在正则表达式中有特殊意义
元字符是用来阐释字符表达式意义的字符,即,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。
二、正则表达式的分类
(1)基本正则表达式
a. 字符匹配
字符 | 意义 |
* | 匹配其前面的字符任意次(0次、1次或多次) |
. | 匹配任意单个字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
[xyz] | 匹配指定范围内的任意单个字符,字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符仅有反斜线保持特殊含义,用于 转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述。例如,[0-9]、[a-z]、[A-Z]、[a-zA-Z0-9];如果如果出现在首位则仅作为普通字符。 |
[^] | 匹配指定范围外的任意单个字符 |
.* | 匹配任意长度的任意字符 |
转义符,屏蔽一个元字符的特殊意义 | |
? | 匹配起前面字符0次或1次 |
+ | 匹配其前面字符1次或多次 |
< | 匹配字符串的开始位置 |
> | 匹配的字符串结束位置 |
<word> | 精确匹配符号 精确匹配到某个word,而不是出现在word中的部分 |
{m} | 匹配其前面的字符m次 |
{m,} | 匹配其前面字符最少m次 |
{,n} | 匹配其前面字符最多n次 |
{m,n} | 匹配其前面字符最少m次,最多n次 |
b. 特殊符号表示
特殊符号 | 意义 |
[:alnum:] | 代表英文大小写字节及数字,亦即 0-9, A-Z, a-z |
[:alpha:] | 代表任何英文大小写字节,亦即 A-Z, a-z |
[:blank:] | 代表空白键与 [Tab] 按键两者 |
[:cntrl:] | 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] | 代表数字而已,亦即 0-9 |
[:graph:] | 除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键 |
[:lower:] | 代表小写字节,亦即 a-z |
[:print:] | 代表任何可以被列印出来的字节 |
[:punct:] | 代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $... |
[:upper:] | 代表大写字符,亦即 A-Z |
[:space:] | 任何会产生空白的字节,包括空白键, [Tab], CR 等等 |
[:xdigit:] | 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符 |
(2)扩展正则表达式
a. 字符匹配
字符 | 意义 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。 |
+ | 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 |
(pattern) | 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“(”或“)”。 |
x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。 常与()配合使用,如(x|y) |
{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?”。请注意在逗号和两个数之间不能有空格。 |
区别于通配符