正则表达式基础知识
Posted daihu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式基础知识相关的知识,希望对你有一定的参考价值。
一、行的起始和结束
正则表达式中,最容易理解的元字符或许就是脱字符号/^/和美元符号/$/。
在检查一行文本时,/^/代表一行的开始,/$/代表一行的结束。
例如,正则表达式/cat/寻找的是一行文本中任意位置的c·a·t,但是/^cat/只寻找行首的c·a·t
—— /^/用来把匹配文本“锚定”在这一行的开头。同样,/cat$/只寻找行末的c·a·t,例如以 scat 结尾的行。
脱字符号和美元符号的特别之处就在于,他们匹配的是一个位置,而不是具体的文本。
二、字符组
1、匹配若干字符之一
无论字符组中的内容有多少,一个字符组只匹配目标文本中的单个字符。
如果我们需要搜索的是单词“grey”,同时又不确定它是否写作“gray”,就可以使用正则表达式结构体/[···]/。它容许使用者列出在某处期望匹配的字符,通常被称作字符组。/e/匹配字符e,/a/匹配字符a,而正则表达式/[ea]/匹配字符a或者e。所以,/gr[ea]y/的意思是:先找到g,跟着是一个r,然后是一个a或者e,最后是一个y。
请注意,在字符组以外,普通字符都有“接下来是”的意思——“首先匹配g,接下来是r……”。而字符组的内容是在同一个位置能够匹配的若干字符,所以它的意思是“或”。
在一个字符组中可以列举任意多个字符。例如/[123456]/匹配1到6中的任意一个数字。
连字符:
在字符组内部,字符组元字符‘-’(连字符)表示一个范围:/[1-6]/与/[123456]/是完全一样的。/[0-9]/和/[a-z]/是常用的匹配数字和小谢字母的简便方式。
多重范围:
字符组内部,多重范围也是容许的,例如/[0123456789abcdeABCDE]/可以写作/[0-9a-eA-E]/(或则也可以写作/[a-eA-E0-9]/,顺序无所谓)。我们还可以把字符范围与普通文本结合起来:/[0-9a-z_!.?]/用来匹配一个数字、小写字母、下划线、惊叹号、点号或者是问号。
请注意:
只有在字符组内部,并且不处于字符组的开头,连字符‘-’才是元字符——否则它就只能匹配普通的连字符号。并且点号和问号都是普通字符。
同样的道理,问号和点号通常被当作元字符处理,但在字符组中咋不是如此(说明白一点,/[0-9a-z_!.?]/里面,真正的特殊字符就只有那两个连字符)。
不妨把字符组看作是独立的微型语言。在字符组内部和外部,关于元字符的规定(哪些是元字符,以及它们的意义)是不同的。
2、排除型字符组
用/[^···]/取代/[···]/,这个字符组就会匹配任何未列出的字符。
例如,/[^1-6]/匹配除了1到6以外的任何字符。这个字符组中开头的/^/表示“排除”。
三、用点号匹配任意字符
元字符/./(通常称为点号)是用来匹配任意字符的字符组的简便写法。如果需要在表达式中使用一个“匹配任何字符”的占位符,用点号就很方便。
四、多选结构
/|/是一个非常简洁的元字符,它的意思是“或”(or)。依靠它,我们能够把不同的子表达式组合成一个总的表达式,而这个总的表达式又能够匹配任意子表达式。例如/Bob/和/Robert/是两个表达式,但/Bob|Robert/能够同时匹配其中任意一个的正则表达式。在这样的组合中,子表达式称为“多选分支”。
回头来看/gr[ea]y/的例子,有意思的是,它还可以写作/gray|grey/,或者是/gr(a|e)y/。后者用括号来划定多选结构的范围(正常情况下,括号也是元字符)。请注意,/gr[a|e]y/不符合我们的要求——在这里,‘|’只是一个和a与e一样的普通字符。
五、可选项元素
现在来看color和colour的匹配。它们的区别在于,后面的单词比前面的多一个u,我们可以用/colou?r/来解决这个问题。元字符/?/(也就是问号)代表可选项。把它加在一个字符后面,就表示此处容许出现这个字符,不过它的出现并非匹配成功的必要条件(即此处这个字符允许出现0次或1次)。
/u?/这个元字符与我们之前看到的元字符都不相同,它只作用于之前紧邻的元素。
六、其他量词:重复出现
/+/(加号)和/*/(星号)的作用与问号类似。
元字符/+/表示“之前紧邻的元素出现一次或多次”,而/*/表示“之前紧邻的元素出现任意多次,或者不出现”。
问号、加号和星号这3个元字符,统称为量词,因为它们限定了所作用元素的匹配次数。
七、规定重现次数的范围:区间
正则表达式中能够使用元字符序列来自定义重现次数的区间:/{min,max}/,这称为“区间量词”。
例如,/···{3,12}/能够容许的重现次数在3到12之间。
八、转义
如果需要匹配的某个字符本身就是元字符,正则表达式改如何处理呢?
例如,我想要检索互联网的主机名ega.att.com,使用/ega.att.com/可能会得到megawatt_com的结果。
因为/./(点号)本身就是元字符,它可以匹配任何字符,包括空格。
真正匹配文本中点号的元序列应该是反斜线加上点号的组合:/ega.att.com/。
/./称为“转义的点号”或者“转义的句号”,这样的办法适用于所有的元字符,不过在字符组内部无效。
九、元字符总结:
. | 点号 | 匹配单个任意字符 |
[···] | 字符组 | 匹配单个列出的字符 |
[^···] | 排除型字符组 | 匹配单个未列出的字符 |
char | 转义字符 | 若char是元字符,或转义序列无特殊含义时,匹配char对应的普通字符 |
? | 问号 | 0次或1次 |
* | 星号 | 任意多次 |
+ | 加号 | 1次或多次 |
{min,max} | 区间量词 | 至少min次,之多max次 |
^ | 脱字符 | 匹配一行的开头位置 |
$ | 美元符 | 匹配一行的结束位置 |
| | alternation | 匹配任意分隔的表达式 |
(···) | 括号 | 限定多选结构的范围,标注量词作用的元素,为反向引用“捕获”文本 |
参考书籍:《精通正则表达式》
以上是关于正则表达式基础知识的主要内容,如果未能解决你的问题,请参考以下文章