标签:
原文地址:https://swtch.com/~src/regexp/regexp1.html
正则表达式是一个用于描述一组字符串的标记。当一个特定的字符串是在被正则表达式所描述的组合时,我们经常说正则表达式匹配这个字符串。
最简单的正则表达式是一串简单的原义的字符串。除了特殊的元字符*+?(),字符串会匹配他们自身。为了匹配元字符,用转义字符\来避免它,:\+匹配一个原义的加号。
两个正则表达可以交替的或者相互联系去组成一个新的正则表达式:例如如果e1匹配s ,并且e2匹配t,那么e1|e2匹配s或者t,并且e1e2匹配st。
元字符*,+和?是重复操作符,e1*匹配0个或者多个(可能不同)字符串,每一个都匹配e1;e1+匹配一个或者多个;e1?匹配0个或一个。
操作符的优先权,从最弱到最强,首先是交换操作符,其次是相联系的操作符,最后是重复操作符。仅仅作为算数表达,明确的圆括号可以被表达不同的意思。例如,ab|cd和(ab)|(cd)是同样的意思,ab*和a(b*)也是等同的。
目前被描述的语法是传统的Unix egrep正则表达的子集。这个子集足够描述所有的正则表达,粗略来说,一个正则语言是一组可以被用固定大小的内存对文本经过简单的匹配的字符串。较新的正则表达引擎(尤其是perl和其他类似的)已经加了很多新的操作符和转义字符串(escape sequences)。这些增加的功能让正则表达式更加简洁并且有时更加神秘(crytic),但是通常不是那么强大:these fancy new regular expressions almost always have longer equivalents using the traditional syntax。
一个常见的确提供强大的功能的正则表达扩展是回溯引用(backreferences)。回溯引用类似与\1,\2匹配之前被圆括号括起来的表达式,并且,(cat|dog)\1匹配catcat和dogdog,但是不匹配catdog,dogcat。如果考虑理论,包含回溯引用的正则表达式并不是正则表达式。回溯引用的正则表达往往带来很大的开销,考虑最坏的情况,最好的做法是采用指数级别的搜索算法。就如perl用的。perl和别的语言目前不能移除回溯引用功能,当然,当不需要回溯引用的正则表达时,他们可以使用更快的算法。这篇文章就是关于那些较快的算法。
标签:
原文地址:http://www.cnblogs.com/saltyx/p/4777302.html