正则表达式
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式。
在文件命令中经常会使用pattern正则表达式,它是可以描述一类字符串的模式(pattern),如果一个字符串可以用某个正则表达式来描述,就称这个字符和该正则表达式匹配。这和dos中用户可以使用通配符“*”代表任意字符类似。在linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作等。
虽然正则表达式多年来在工具与UNIX版本上不断在变化,但POSIX标准仅提供两种正则表达式。你可以利用标准的库程序进行模式匹配的工作。这样就可以编写出专用的工具程序,用于与grep一致的正则表达式(POSIX称之为基本型正则表达式,Basic Regular Expressions,BRE),或是用于与egrep一致的正则表达式(POSIX称之为扩展型正则表达式,Extended Regular Expressions,ERE)。
正则表达式的模式可以包括以下内容:
-
字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。
-
特殊字符:例如点号
.
、星号*
、加号+
、问号?
等,它们具有特殊的含义和功能。 -
字符类:用方括号
[ ]
包围的字符集合,用于匹配方括号内的任意一个字符。 -
元字符:例如
\d
、\w
、\s
等,用于匹配特定类型的字符,如数字、字母、空白字符等。 -
量词:例如
{n}
、{n,}
、{n,m}
等,用于指定匹配的次数或范围。 -
边界符号:例如
^
、$
、\b
、\B
等,用于匹配字符串的开头、结尾或单词边界位置。
1. 元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
2. 特殊字符
BRE和ERE都支持的字符:
\:忽略正则表达式中特殊字符的原有含义,有时则是相反地打开后续字符的特殊含义。
.:匹配任何单个字符,但NUL除外。==>匹配字符
如tol.toy表示一行中,含有tol这3个字母,加上任何一个字符,再接着toy这3个字母。
*:匹配在它之前的任何数目(或没有)的单个字符,即“匹配0个或多个前面的单个字符”。以ERE而言,此前置字符可以是正则表达式,例如:因为.表示任一字符,所以".*"代表“匹配任一字符的任意长度”。
以BRE来说,*若置于正则表达式的第一个字符,不具有任何意义。 ==>匹配数目
如tol.*toy表示一行中含有tol这3个字母,加上任意的0或多个字符,再继续toy这3个字母(例如toltoy,tolstory,tolWHOtoy)。
^:匹配正则表达式的行首或字符串起始,BRE:仅在正则表达式的开头处具有特殊含义,ERE:置于正则表达式的任何位置都具有特殊含义。如BRE下ab^cd中^表示的就是本身。
$:匹配正则表达式的行尾或字符串尾,BRE:仅在正则表达式的结尾处具有特殊含义,ERE:置于正则表达式的任何位置都具有特殊含义。如BRE下ab$cd中$表示的就是本身。
^$用来匹配空的字符串或行列。
[]:方括号表达式(bracket expression),匹配方括号内的任一字符。
[-]:连续字符的范围,如[A-Z],即A、B、C一直到Z都符合要求;^符号置于方括号里第一个字符则有反向含义,匹配不在方括号内的任意一个字符。
仅BRE支持的的meta字符(特殊字符):
\{n,m\}: 区间表达式,匹配在它前面的单个字符重现的次数区间。\{n\}指的是重现n次;\{n,\}则为至少重现n次,而\{n,m\}为重现n至m次。n与m的值必须介于0至RE_DUP_MAX(含)之间,后者最小为255。
\( \): 反向引用。将\(与\)间的模式存储在特殊的“保留空间(holding space)”。最多可以将9个独立的子模式(subpattern)存储在单个模式中。匹配于子模式的文本,可以通过转义序列(escape sequences)\1至\9被重复使用在相同模式中。例如\(ab\).*\1,指的是匹配于ab组合的两次重现,中间可存在任何数据的字符。\(ab\)\(cd\)[def]*\2\1匹配abcdcdab, abcdeeecdab, abcddddeeefffcdab,...
反向引用在寻找重复字符及匹配引号时特别好用,\(["']\).*\1匹配以单引号或双引号括起来的字,如‘foo'或“bar”。
\n: 重复在\(与\)括号内第n个子模式至此处的模式。n为1至9的数字,1为由左开始。
仅ERE支持的meta字符:
{n,m}: 同上面BRE的\{n,m\},只是括号内没有反斜杠。
+:匹配前面正则表达式的一个或多个实例。
?:匹配前面正则表达式的零个或一个实例。
|:匹配于|符号前或后的正则表达式。 交替,优先级最低。
():匹配于方括号括起来的正则表达式群。分组
^abcd|efgh$匹配字符串的起始处是否有abcd或者字符串结尾处是否有efgh
^(abcd|efgh)$找一个正是abcd或正是efgh的字符串
3. Posix方括号表达式
为配合非英语的环境,POSIX标准强化其字符集范围的能力。
方括号表达式除了字面上的字符外,还支持字符集(character class),排序符号(collating symbol),等价字符集(equivalence class)。
排序(collating)是指给予成组的项目排列顺序的操作。一个posix的排序元素由当前locale中的元素名称组成,并由[.与.]括起来。
等价字符集则用来让不同字符在匹配时视为相同字符。等价字符集将类别(class)名称以[=与=]括起来。
Posix字符集以[:与:]将关键字组合起来,表示字符的类别。
[:alunm:] 数字字符
[:alpha:] 字母字符
[:blank:] 空格(space)与定位(tab)字符
[:cntrl:] 控制字符
[:digit:] 数字字符
[:graph:] 非空格(nonspace)字符
[:lower:] 小写字母字符
[:print:] 可显示字符
[:punct:] 标点符号字符
[:space:] 空白字符(whitespace)
[:upper:] 大写字母字符
[:xdigit:] 十六进制数字
注:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内认可。也就是说,像[:alpha:]这样的正则表达式,匹配字符a、l、p、h以及:,表示所有英文字母的正确写法应为[[:alpha:]]。
在方括号表达式中,所有其他的meta字符都失去其特殊含义。所以[*\.]匹配字面上的星号、反斜杠以及句号。
要让]进入该集合,可以将它放在列表的最前面[]*\.]。
要让-进入该集合,可以将它放在列表的最前面[-*\.]。
要让]和-进入该集合,]放到第一位,-放到最后一位,可以将它放在列表的最前面[]*\.-]。
posix明确指出:NUL字符不需要是可匹配的。此外个别工具程序不允许使用.或[]来进行换行字符匹配。
4. 优先级
BRE运算符优先级
ERE运算符优先级
5. 正则表达式的扩展
通用扩展
注:单词是由字母、数字及下划线组成。
6. 调试工具
可参考:如何调试正则表达式 -阿里云
参考
1. http://www.cnblogs.com/jiqing9006/category/405401.html
2. http://deerchao.net/tutorials/regex/regex.htm
3.《shell脚本学习指南》
4. 5分钟搞懂正则表达式