zoukankan      html  css  js  c++  java
  • 《精通正则表达式》读书笔记(1)

    声明:笔记仅供参考,不足之处请见谅。

     

    正则表达式能解决什么实际问题?

    正则表达式能给你带来超乎你之前想象的文本处理能力。如常见的简单文本替换或查找,虽然普通编辑器的替换或查找能满足一般的需求了,但是如果要处理稍微复杂点的替换或查找操作,那么也许你必须手动处理了。(如替换或查找文本中的所有Email地址)。

    一旦掌握了正则表达式,你就会知道它简直是无价之宝,也难以想象如果没有它,这日子该怎么过呢?

    正则表达式很神奇,所以很难吗?

    如 果没有相关魔术表演的知识,一定觉得魔术真的很神奇;就像对待外语一样,一旦以掌握了它,它不再是天书了。那么正则表达式也是如此,如果你没有正则表达式 相关经验,可能看不懂任何相关正则表达式的意义,但是如果你掌握了它,那情况就不一样了,只要练熟之后,你也可以变魔术了。

    以操作系统上的搜索做类比

    相信大家都用过自己所用系统上的搜索来寻找文件吧,如果你没用过并不代表你不需要哦,只是时机未到罢了。

    相 信绝大多数朋友都是Windows的粉丝,那么该操作系统上启动搜索的快捷键是Win+F,正如一般软件启动搜索对话框的快捷键是ctrl+F,只不过针 对系统的ctrl是Win键而已。在操作系统的搜索使用中就有类似正则表达式的踪影,比如输入*.txt,则表示搜索的是以.txt结尾的文件/文件夹, 此处*是一个特殊字符,代表任意文本,类似的还有?问好,代表任意的单个字符。通过这两个字符,搜索文件的能力大大增强了,但这绝对不是正则表达式,想比 正则表达式,这里的搜索的能力还是很有限的。

    正是应这种需求,一种“通用的模式语言”发展了起来,这种功能强大的模式语言和模式本身被称为“正则表达式”(Regular Expression)

    以语言作类比

    完整的正则表达式由两种字符构成:特殊字符(称为“元字符”,如操作系统中搜索时使用的*,?这种匹配符号,正则表达式的元字符提供了更强大的描述能力)和普通文本字符(就是其他的文字)。

     

    一些元字符等的记录:

    完整的正则表达式由两种字符构成:特殊字符(元字符)和普通字符(文字)

    正则表达式结构体[...],即字符组/集,一个字符组智能匹配且必须匹配单个字符,字符组内部的元字符和外部的元字符概念不同,如在内部.?*都不是元字符。

    结构体和无结构体的区别:在结构体x[abc]y中,表示的是或的意思,即x然后abc然后y。在无结构体时xabcy表示的是且的意思,x然后a然后b然后c然后y

    在字符组内部的元字符字符组元字符

    -不在[[^后面的"-"表示一个范围,必须写着2个字符中间(应该是有间隔的同类字符):[0-9a-z] 09az中任意一个。

    ^:在[后面的"^"表示匹配排除的,写在字符组中的第1个:[^..][…] 前者匹配任何未列出来的字符,即列出的是不希望匹配的字符;后者匹配列出来的字符。

    PS个字符组,即使是排除型字符组,也需要匹配一个字符。如q[^u]无法匹配“Iraq”,因q后面无字符了。

     

    (普通)元字符(非字符组中的元字符,当然有符号相同,但作用不同的):

    ^:行开头,在字符组内部和外部表示的意义不一样;

    $:行结尾;

    .:点号,匹配任意字符;

    |:或,把不同的子表达式组合成一个总的表达式,从而使总表达式能够匹配任意的子表达式。子表达式称为“多选分支alternative”,一般会用括号来划定多选结构的范围

    ():括号,划定范围,如多选结构的总表达式一般用括号括起来,与其他不相干字符划分开来。如ga|yg(a|y)区别是,前者gay,后者gagy。另外括号一般还能够“记住”它们包含的子表达式匹配的文本,见反向引用。

    //// ? + * 这三个元字符统称为量词,即限定了所作用元素的匹配次数。

    ?:可选项元素,作用于问号前面紧邻的元素,表示是可选项,即有或没有

    +:加号作用于前面紧邻的元素,表示能出现一次或多次,即>=1

    *:星号作用于前面紧邻的元素,表示能出现任意多次或者不出现,即>=0

    {1,2}:区间量词,作用于前面紧邻的元素,限定其出现的次数范围为1-2

    反向引用:容许我们匹配与表达式先前部分匹配的同样的文本,即使用先前匹配的东西来再次匹配。一般通过\1这样的形式表示第一个记忆的匹配文本。

    \<:单词的起始位置,这种貌似只在egrep中适用

    \>:单词的结束位置,这种貌似只在egrep中适用

    ^$

    ^cat$ 匹配:行开头,然后字母,然后行结尾

    ^$ 匹配:行开头,然后行结尾,即空行(无任何字符)

    ^ 匹配:行开头。无任何意义,每一行都有开头

    额外的参数:

    -i:忽略大小写,这种写法在egrep中适用,其它处一般也是通过i来表示,但是写法不一样

    神奇的转义:转义符\,反斜线

    如果需要匹配的某个字符本身就是元字符,那么需要对其进行转义,如\?,这个问号就是转义的了,是普通字符了,不是元字符了。(可能某些工具如egrep某些版本不支持在字符组内部使用转义)。PS:在某些用法中,反斜线后面如果跟的不是元字符,那么可能会有特殊的用途,即组合为元字符,即反过来了。

     

    PS:不同语言对正则表达式有不同的改进,因此正则表达式有很多“流派”。

  • 相关阅读:
    SVG 支持动画
    js ==与===区别(两个等号与三个等号
    PHP设计模式之单例模式
    MySQL函数大全 及用法示例
    MySQL存储过程和函数
    MYSQl left join联合查询效率分析
    STL 算法[转 ]
    PHP 调整浏览器缓存
    php filter_var[转]
    C++ string学习[转]
  • 原文地址:https://www.cnblogs.com/yevon/p/2935048.html
Copyright © 2011-2022 走看看