[翻译系列]正则表达式简介

正则表达式

本文翻译自英文博客,来源链接请戳这里

正则表达式简介

正则表达式是用来表达字符串集合的符号标记(符号标记串)。当特定的字符串符合正则表达式所描述的字符串集合的规则时,通常我们说该字符串和该正则表达式所匹配(match)。

最简单的正则表达式是单个字面意思的字符。例如a、b、c、1、2、3这样的字符,不同于*+?()|这样的元字符,非元字符表示他们本身。也就是模式(pattern)串"a"仅仅匹配字符串"a"。换句话说,该模式串描述的字符串集合仅仅表示集合{"a"},仅此而已。如果我们想要表示元字符本身,使用转义字符。例如我们可以使用+来表示字面意思的+字符。因此,如果我们想要匹配本身,那么需要使用\

正则表达式之间可以做一定的运算从而形成新的正则表达式。这样的运算包括alternated或者concatenated。假如e1能够匹配到s并且e2能够匹配t。那么e1|e2s或者t匹配,而e1e2st匹配。

元字符*,+?用来表示操作的重复运算。e1*能够匹配到一连串的(零次或零次以上,匹配到的字符有可能不同,但是都在该模式描述的字符串集合里)字符串。同理的,e1+匹配一次或者一次以上,e1?描述零次或者一次的匹配。

上述元字符的运算遵循一定的优先级规则。从最弱到最强的绑定,分别为alternation,之后为concatenation,最后是重复运算符。显时的括号可以用来强制改变运算顺序。例如:表达式ab|cd同表达式(ab)|(cd)表示相同的意思,而ab*同表达式a(b*)意思相同。

截止目前介绍的语法,同传统的Unix egrep正则表达式语法保持一致。这一子集已经能够基本上描述所有的正则语言了。不严格的讲,正则表达式能够表示特定的字符串集合,通过使用有限容量的内存,单趟就能够完成匹配。在其他的一些编程语言里,例如Perl,添加了一些新的操作或者转义序列,他们有的使正则表达式更简介直观了,但有些也使得表达式更晦涩难懂了,但这些新的操作转移序列都没有使正则表达式(实现)更强大。

原文地址:https://www.cnblogs.com/zhangshoulei/p/14632049.html