成功总是垂青于有准备的人。

BIBLE模型

发掘积累过程的快感

首页»BIBLE模型 Perfect»计算机基础»编程基础»第四节:正则表达式元字符(二)

正则表达式匹配任意符——点号

元字符"/./"是用来匹配任意字符的字符组的简写方法。如果需要在正则表达式中使用一个“匹配任何字符”的占位符,用点号就很方便。记住:字符组内部和字符组外面,元字符的定义和意义是不一样的。/03[-./]19[-./]6/中,点号并不是元字符,这里的连字符同样也不是元字符,因为它们都紧接在[或者[^之后。如果连字符不在字符组开头,例如[.-/],就是用来表示范围的。

正则表达式-多选结构

匹配任意子表达式

符号/|/在正则表达式中是一个简捷的元字符,学过编程的都知道|在代码中是"或"的意思。通过它,我们能够把不同的子表达式祝贺成一个总的表达式,而这个 总的表达式又能够匹配任意子表达式。假如:/Bob//Robert/是两个表达式,但是/Bob|Robert/就是能够同时匹配其中任意一个的 正则表达式。在这样的组合中,子表达式被称为"多选分之"。

现在我们回到以前的一个颜色例子:/gr[ea]y/这个例子中,我们也可以写作:/grey|gray/或者/gr(a|e)y/(请注意了:多选分子的元字符|,分割的是这个符号的前后,所以如果在正则表达式中需要使用多选分之的时候,注意括号的使用。比如我要匹配一个图片标签,图片标签它可能是这样的两种:<img src=""><img src=''>,那么这个正则表达式该这样: /\<img.*?src=("|\).*?("|').*?\>/),当然了也可以这样/\<img.*?src=["'].*?["'].*?\>/

对表达式/gr(e|a)y/来说,括号是必须的,没有括号就成了匹配/gre/或者/ay/了,这显然不符合我们的需求。多选结构可以包括很多字符,但不能超越括号的界限。

注意这两个正则表达式:/gr[ea]y//gr(e|a)y/,这两个例子可能让人觉得多选结构与字符组没有太大的区别,但是千万别混淆这两个概念。 一个字符组只能匹配目标文中的单个字符,而每个多选结构自身都可能是一个完整的正则表达式,都可以匹配任意长度的文本。字符组基本可以算是一门独立的微型语言    (例如,对于元字符,它们有自己的规定),而多选结构是"正则表达式语言主体"的一部分。随着深入运用,你会发现这两者都很有用处。

同样的,在一个包含多选结构的表达式中使用脱字符和美元符也要特别小心。比较/^From|Subject|Date://^(From|Subject|Date):/就会发现,它们虽然看起来都很相似,但是匹配结果却大不相同。第一个表达式中由三个 多选分支构成,所以他能匹配/^From/或者/Subject/或者/Date:/,实用性不大。我们希望在每一个分支钱都有一个脱字符,之后都有一个/:/。 所以,应该使用括号来限制这些多选分子:

/^(From|Subject|Date):/

现在,这3个多选分支都受到括号的限制,所以这个正则表达式的意思是:匹配以From或者Subject或者Date开头然后匹配:

忽略大小写

基本的,忽略大小写,就是利用i这个参数,在PHP中,忽略大小写的正则表达式可以这样写/bob/i,我经常在处理HTML TAG的时候使用 i参数。

单词分界符

使用正则表达式时经常会遇到一个问题,期望匹配的"单词"包含在另一个单词之间。在cat、gray、Smith的例子中,我提到过这个问题。不过某些版本的egrep对单词识别提供了 有限的支持:也就是单词分界符(单词开头和结束位置)的匹配。

如果你的egrep支持"元字符序列"/\</和/\>/,就可以使用它们来匹配单词分界的位置。比如正则表达式/\<cat\>/的意思就是匹配单词的开头位置,然后是 cat这三个字母,然后是单词结束的位置。如果你不这么理解也可以理解为匹配cat这个单词。

请注意,<和>并不是元字符,只有当它们与斜线结合起来的时候,整个序列才具有特殊意义。重要的是特殊意义,而不是字符的个数,有时有"元字符"和元(字符)序列是等价的。

记住:并不是所有版本的egrep都支持单词分界符,即使支持的版本也不见得聪明到"认得出"单词。"单词的起始位置"只不过是一系列字母和数字符号开始的位置,而结束位置就是它们结尾的地方。前面的例子中,有写到\>和\<,其实这是不必要加反斜线的,PHP中不支持单词分界符,><在PHP正则表达式中也不是特殊字符。

正则表达式单词的起始位置

小结

元字符名称匹配对象
.
[...]
[^...]
点号
字符组
排除型字符组
单个任意字符
列出的任意字符
未列出的任意字符
^
$
\<
\>
脱字符
美元符
反斜线-小于
反斜线-大于
行的起始位置
行的结束位置
单词的起始位置(某些版本的egrep可能不支持)
单词的结束位置 (某些版本的egrep可能不支持)
|
(...)
竖线
括号
匹配分隔两边的任意一个表达式
限制竖线的作用范围,其他的功能接下来讨论

另外还需要注意的:

  • 在字符组内部,元字符的定义规则是不一样的。例如字符组外部点号是元字符,在内部则不是。相反的,连字符在字符组内部是元字符,否则不是。
  • 不要混淆多选项和字符组,字符组/[abc]/和多选项/(a|b|c)/在这里的效果固然一样,但是这个例子中的相似性并不能扩展。多选项没有排除功能,而字符组有排除功能。
  • 排除型字符组是表示所有为列出字符的字符组的简便方法。因此,/[^a]/的意思并不是"只有当这个文字不是a的时候才能匹配",而是说"匹配一个不等于a的字符"。这里的差别很细微,但是很重要。比如前面的概念可以匹配一个空行,而/[^a]/则不行。
  • i参数规定匹配时不区分大小写。
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼。 “Bible”是圣经,有权威的书,我们的本意就是为开发者提供真正有用的的资料。 我的电子邮件1217179982@qq.com,您在开发过程中遇到任何问题,欢迎与我联系。
Copyright © 2017. All rights reserved. 本站由 Helay 纯手工打造