正则表达式 pcre
1)历史和起源正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创新地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。 在1956 年,出生在被马克?吐温(Mark Twain)称为“美国最美丽的城市之一的”哈特福德市的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。 之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。Jeffrey Friedl 在其著作“Mastering Regular Expressions (2nd edition)”中对此作了进一步阐述讲解,如果你希望更多了解正则表达式理论和历史,推荐你看看这本书。 自此以后,正则表达式被广泛地应用到各种UNIX或类似于UNIX的工具中,如大家熟知的Perl。Perl的正则表达式源自于Henry Spencer编写的regex,之后已演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),pcre是一个由Philip Hazel开发的、为很多现代工具所使用的库。正则表达式的第一个实用应用程序即为Unix中的 qed 编辑器。 然后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展,演变成为目前计算机技术森林中的一只形神美丽且声音动听的百灵鸟。 以上是关于正则表达式的起源和发展的历史描述,到目前正则表达式在基于文本的编辑器和搜索工具中依然占据这一个非常重要的地位。 在最近的六十年中,正则表达式逐渐从模糊而深奥的数学概念,发展成为在计算机各类工具和软件包应用中的主要功能。不仅仅众多UNIX工具支持正则表达式,近二十年来,在WINDOW的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!从正则式在Microsoft Visual Basic 6 或 Microsoft VBScript到.NET Framework中的探索和发展,WINDOWS系列产品对正则表达式的支持发展到无与伦比的高度,目前几乎所有 Microsoft 开发者和所有.NET语言都可以使用正则表达式。如果你是一位接触计算机语言的工作者,那么你会在主流操作系统(*nix[Linux,Unix等]、Windows、HP、BeOS等)、目前主流的开发语言(PHP、C#、Java、C++、VB、Javascript、Ruby以及python等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。(摘自《百度百科--正则表达式》) 2) 正则表达式的定义正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 给定一个正则表达式和另一个字符串,我们可以达到如下的目的:1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。 正则表达式的特点是:1. 灵活性、逻辑性和功能性非常的强;2. 可以迅速地用极简单的方式达到字符串的复杂控制。3. 对于刚接触的人来说,比较晦涩难懂。 由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。 3) 正则表达式的语法正则表达式由一些普通字符和一些元字符组成,普通字符就是我们平时常见的字符串、数字之类的,当然也包括一些常见的符号,等等。而元字符则可以理解为正则表达式引擎的保留字符,就像很多计算机语言中的保留字符一样,他们在正则引擎中有特殊的意义,下面将介绍JavaScript中和正则相关的元字符以及API。(不同的计算机语言,对正则引擎的实现不是完全一致的,所以,有些元字符和组合方式在JavaScript中不存在) 我们将按照下面的分类将元字符一一列出: 3.1字面量字符( Literal Characters )
3.2字符类( Character Classes )
3.3重复( Repetition )
3.4非贪婪的重复(non-greedy)
3.5选择、分组和引用
3.6指定匹配位置
3.7标志
4) JavaScript中的正则API上一部分,我们了解了正则表达式的语法,那么,如何在JavaScript中构造一个正则表达式的对象呢?有以下两种方法: 1.字面量表示法,例如:var reg = /d+/i; 就表示一个正则表达式的实例,这个写法需要注意的地方是:正则表达式的主体部分,也就是示例中的 d+ ,必须位于“ / / ”之间,而标志位则需要跟在结束 "/" 的后面。 2.实例化RegExp对象,例如: var reg = new RegExp( "d+","igm" );第一个参数是表达式的主体,而第二个参数则是标志位,此参数可选。 上面两种方法可以得到正则表达式的实例,通常,我们都使用第一种方式,即字面量的方式,这种方式比较直观,第二种方式通常用来组合表达式,比如,通过用户输入的某个值,来构造表达式,例如:var input = 'this is a test'; var reg = new RegExp( "dw" + input,); 通过这种方式,我们可以组合成新的表达式,来达到我们的目的。在使用这种方式时,需要注意对特殊字符的转义和过滤,以免遭受恶意攻击。 JavaScript中,除了正则表达式对象外,字符串也和正则表达式息息相关。可以说,RegExp和String 是密不可分的,缺一不可。所以,和正则相关的API就是RegExp对象和String对象的一些API。 首先是RegExp对象,该对象的实例中,有三个方法和正则表达式相关,分别是test( ),exec( )和compile( )。而String对象中和正则相关的方法则包括:match( ),replace( ),search( ),split( ),接下来会对这些方法做详细介绍。 4.1 exec( )exec( ) 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。 例子1:
如果匹配成功,该方法的返回结果是一个数组[array],该数组的第一个元素则是匹配的字符串,后面的元素则是表达式分组所捕获到的值,分组为1,则是该数组中的第一个元素,依次类推。若没有分组,该数组只包含一个元素。当然,该数组还有另外3个属性,input,index和lastIndex。若没有匹配成功,则返回null。 input属性表示目标字符串。 index属性表示匹配到的位置。 lastIndex属性表示上一次匹配后的位置。 另外,需要注意的是,若表达式实例中包含了全局(g)标志位,则会从 lastIndex 所标记的位置开始查找,而不会从字符串的开始位置进行。所以,我们可以多次调用exec( )方法,比如:
详细描述请参考: 4.2 test( )test( ) 方法比exec( )方法简单,该方法只会返回一个Boolean值,如果匹配成功,则返回true,否则,返回false。可参考下面的示例:
详细描述请参考: 4.3 match( )需要注意的是,该方法的参数,也就是正则表达式添加了全局( g )标志位时的变化。如果没有添加全局标志位,返回结果和exec( )方法的返回值一样,但不包含所有的属性。 详细描述请参考: 4.4 replace( )该方法是字符串中非常强有力的方法,它接收两个参数,第一个参数为表达式,也可以直接传入字符串,该方法在内部会自动将字符串转换为正则表达式;第二个参数是想要替换成的字符串,该参数可以为一个函数,但是该函数的返回值必须为字符串。具体用法请参考 http://msdn.microsoft.com/en-us/library/t0kbytzc(v=vs.94).aspx 4.5 split( )该方法可以按照传递的参数对字符串进行分割,会返回一个数组,里面包含了分割后的元素。一般用法是直接传入字符串进行分割,当然,也可以传入正则表达式,按表达式分割,详细信息请参考: http://msdn.microsoft.com/en-us/library/t5az126b(v=vs.94).aspx 4.6其它compile( ),search( )等方法,在日常使用中较少使用,大致了解一下即可。 5) 实例解析大家可以参考【正则表达式经典实例】,请参考附件。 小结以上主要讲解了正则表达式的基本语法和常用API,对于如何构造复杂的表达式和表达式的匹配原理,本文并未涉及。说实话,正则表达式本身确实晦涩难懂,比较拗口,大家需在平时,多多温习这些基础的语法和API。 另外,可以用一些工具来辅助我们写出严谨的正则表达式,比如:RegexBuddy或者一些在线的应用。当然,还有浏览器的控制台,可以在里面很方便的进行测试。 在日常的开发中,千万不要在正则上钻牛角尖,因为我们可以利用其它API,达到同样的目的。而且,太过复杂的表达式,效率可能较低,而且,对于以后的维护人员来说,也是非常不方便维护的。 但千万不要浅尝辄止,应该继续深挖正则中的思想,正是这些基础的思想,才能帮我我们在编程上更上层楼。 参考信息 http://msdn.microsoft.com/en-us/library/z908hy33(v=vs.94).aspx exec() http://msdn.microsoft.com/en-us/library/a55e5s6b(v=vs.94).aspx test() http://msdn.microsoft.com/en-us/library/7df7sf4x(v=vs.94).aspx match() http://msdn.microsoft.com/en-us/library/t0kbytzc(v=vs.94).aspx replace() http://www.w3school.com.cn/js/jsref_obj_regexp.asp regexp obj 精通正则表达式(第三版) 正则表达式经典实例 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |