正则表达式

正则表达式(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. 调试工具

Regex101    RegexTester    runoob

可参考:如何调试正则表达式 -阿里云

 

参考

1. http://www.cnblogs.com/jiqing9006/category/405401.html

2. http://deerchao.net/tutorials/regex/regex.htm

3.《shell脚本学习指南》

4. 5分钟搞懂正则表达式

5. 正则表达式--runoob.com

posted @ 2016-12-18 12:50  yuxi_o  阅读(376)  评论(0编辑  收藏  举报