《精通正则表达式》读书笔记(1)
声明:笔记仅供参考,不足之处请见谅。
正则表达式能解决什么实际问题?
正则表达式能给你带来超乎你之前想象的文本处理能力。如常见的简单文本替换或查找,虽然普通编辑器的替换或查找能满足一般的需求了,但是如果要处理稍微复杂点的替换或查找操作,那么也许你必须手动处理了。(如替换或查找文本中的所有Email地址)。
一旦掌握了正则表达式,你就会知道它简直是无价之宝,也难以想象如果没有它,这日子该怎么过呢?
正则表达式很神奇,所以很难吗?
如 果没有相关魔术表演的知识,一定觉得魔术真的很神奇;就像对待外语一样,一旦以掌握了它,它不再是天书了。那么正则表达式也是如此,如果你没有正则表达式 相关经验,可能看不懂任何相关正则表达式的意义,但是如果你掌握了它,那情况就不一样了,只要练熟之后,你也可以变魔术了。
以操作系统上的搜索做类比
相信大家都用过自己所用系统上的搜索来寻找文件吧,如果你没用过并不代表你不需要哦,只是时机未到罢了。
相 信绝大多数朋友都是Windows的粉丝,那么该操作系统上启动搜索的快捷键是Win+F,正如一般软件启动搜索对话框的快捷键是ctrl+F,只不过针 对系统的ctrl是Win键而已。在操作系统的搜索使用中就有类似正则表达式的踪影,比如输入*.txt,则表示搜索的是以.txt结尾的文件/文件夹, 此处*是一个特殊字符,代表任意文本,类似的还有?问好,代表任意的单个字符。通过这两个字符,搜索文件的能力大大增强了,但这绝对不是正则表达式,想比 正则表达式,这里的搜索的能力还是很有限的。
正是应这种需求,一种“通用的模式语言”发展了起来,这种功能强大的模式语言和模式本身被称为“正则表达式”(Regular Expression)
以语言作类比
完整的正则表达式由两种字符构成:特殊字符(称为“元字符”,如操作系统中搜索时使用的*,?这种匹配符号,正则表达式的元字符提供了更强大的描述能力)和普通文本字符(就是其他的文字)。
一些元字符等的记录:
完整的正则表达式由两种字符构成:特殊字符(元字符)和普通字符(文字)
正则表达式结构体:[...],即字符组/集,一个字符组智能匹配且必须匹配单个字符,字符组内部的元字符和外部的元字符概念不同,如在内部.?*都不是元字符。
结构体和无结构体的区别:在结构体x[abc]y中,表示的是或的意思,即x然后a或b或c然后y。在无结构体时xabcy表示的是且的意思,x然后a然后b然后c然后y。
在字符组内部的元字符:字符组元字符
-:不在[或[^后面的"-"表示一个范围,必须写着2个字符中间(应该是有间隔的同类字符):[0-9a-z] 0到9和a到z中任意一个。
^:在[后面的"^"表示匹配排除的,写在字符组中的第1个:[^..]与[…] 前者匹配任何未列出来的字符,即列出的是不希望匹配的字符;后者匹配列出来的字符。
PS:一个字符组,即使是排除型字符组,也需要匹配一个字符。如q[^u]无法匹配“Iraq”,因q后面无字符了。
(普通)元字符(非字符组中的元字符,当然有符号相同,但作用不同的):
^:行开头,在字符组内部和外部表示的意义不一样;
$:行结尾;
.:点号,匹配任意字符;
|:或,把不同的子表达式组合成一个总的表达式,从而使总表达式能够匹配任意的子表达式。子表达式称为“多选分支alternative”,一般会用括号来划定多选结构的范围
():括号,划定范围,如多选结构的总表达式一般用括号括起来,与其他不相干字符划分开来。如ga|y和g(a|y)区别是,前者ga或y,后者ga或gy。另外括号一般还能够“记住”它们包含的子表达式匹配的文本,见反向引用。
//// ? + * 这三个元字符统称为量词,即限定了所作用元素的匹配次数。
?:可选项元素,作用于问号前面紧邻的元素,表示是可选项,即有或没有
+:加号作用于前面紧邻的元素,表示能出现一次或多次,即>=1
*:星号作用于前面紧邻的元素,表示能出现任意多次或者不出现,即>=0
{1,2}:区间量词,作用于前面紧邻的元素,限定其出现的次数范围为1-2次
反向引用:容许我们匹配与表达式先前部分匹配的同样的文本,即使用先前匹配的东西来再次匹配。一般通过\1这样的形式表示第一个记忆的匹配文本。
\<:单词的起始位置,这种貌似只在egrep中适用
\>:单词的结束位置,这种貌似只在egrep中适用
^和$
^cat$ 匹配:行开头,然后字母,然后行结尾
^$ 匹配:行开头,然后行结尾,即空行(无任何字符)
^ 匹配:行开头。无任何意义,每一行都有开头
额外的参数:
-i:忽略大小写,这种写法在egrep中适用,其它处一般也是通过i来表示,但是写法不一样
神奇的转义:转义符\,反斜线
如果需要匹配的某个字符本身就是元字符,那么需要对其进行转义,如\?,这个问号就是转义的了,是普通字符了,不是元字符了。(可能某些工具如egrep某些版本不支持在字符组内部使用转义)。PS:在某些用法中,反斜线后面如果跟的不是元字符,那么可能会有特殊的用途,即组合为元字符,即反过来了。
PS:不同语言对正则表达式有不同的改进,因此正则表达式有很多“流派”。