二、正则表达式元字符
正则表达式由两种基本字符类型组成:普通文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。元字符是一个或一组代替一个或多个字符的字符。
根据功能元字符可分分类:字符匹配、匹配次数、定界符、分组及反向引用等。
1 字符匹配:
字符匹配的核心就是“[ ]”,匹配[]中任意一个字符,注意,只匹配一个字符。例如.[aoeiu]匹配任意一个元音字母,[0-9] 匹配任意一位数字,[a-z][0-9] 匹配由小写字母和一位数字构成的两位字符。
注:[:alnum:]等为POSIX字符类,整体指示字符串,[[:alnum:]]才表示对于要匹配字符的范围
元字符 | 作用 |
. | 匹配除换行符“\n”外的任意单个字符 |
[] | 匹配指定范围内的任意字符 |
[^] | 匹配指定范围外的任意字符 |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,亦即A-Z,a-z |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:black:] | 空白字符(空格和制表符) |
[:space:] | 水平和垂直的空白字符(比[:blank:]包含的范围广) |
[:cntrl:] | 不可打印的控制字符,\t,\n,\r,\s等 |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:pumct:] | 标点符号 |
2 字符匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
元字符 | 作 用 |
* | 前一个字符匹配 0 次或任意多次 |
.* | 任意长度的任意字符 |
\? | 匹配其前面的字符0或1次 |
\+ | 匹配其前面的字符至少1次 |
[] | 表示可匹配查找的范围,匹配[]中任意一个字符,只匹配一个字符。例如.[aoeiu]匹配任意一个元音字母,[0-9] 匹配任意一位数字,[a-z][0-9] 匹配由小写字母和一位数字构成的两位字符 |
[^] | 匹配除[]中的字符以外的任意一个字符。例如,[^0-9] 匹配任意一位非数字字符,[^a-z] 匹配任意一位非小写字母 |
\ | 转义符,用于取消特殊符号的含义 |
\{n\} | 匹配前面的字符n次 |
\(n,\} | 匹配前面的字符至少n次 |
\{n,m\} | 匹配前面的字符至少出现 n 次,最多出现 m 次 |
3 定界符
元字符 | 作 用 |
^ | 匹配行首,例如^ab:匹配以ab开头的行 |
$ | 匹配行尾,例如67a$:匹配67a结尾的行 |
^pattern$ | 匹配pattern模式的行 |
^[[:space:]]*$ | 空行 |
\< 或 \b | 单词词首定界 |
\> 或 \b | 单次词尾定界 |
\<pattern\> | 匹配pattern的单词 |
4 分组及反向引用
分组:
用( )将一个或多个字符选择项构成一个整体匹配,相邻的选择项之间用|分隔。
( ) 表示捕获分组,( )会把每个分组里的匹配的值保存起来,多个匹配值可以通过数字n 来查看(n是一个数字,表示第n个捕获组的内容)。
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ..
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推;
反向引用:
反向引用提供了查找重复字符组的简便方法,可以认为是再次匹配同一个字符组的快捷指令。对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。
字符 | 说明 |
(expression) | 匹配字符串expression,并将匹配到的文本保存到自动命名的分组里 |
(?<name>expression) | 匹配字符串expression,并将匹配的文本以name进行命名。该名称不能包含标点符号,不能以数字开头 |
(?:expression) | 匹配字符串expression,不保存匹配的文明,也不给此组分配组号 |
(?=expression) | 匹配字符串expression前面的位置 |
(?!expression) | 匹配后面不是字符串expression的位置 |
(?<=expression) | 匹配字符串expression后面的位置 |
(?<!expression) | 匹配前面不是字符串expression的位置 |
(?>expression) | 只匹配字符串expression一次 |
关于正则表达式元字符掌握这4大类后对于正则表达式的处理就基本没问题了。