[翻译系列]正则表达式简介
正则表达式
本文翻译自英文博客,来源链接请戳这里
正则表达式简介
正则表达式是用来表达字符串集合的符号标记(符号标记串)。当特定的字符串符合正则表达式所描述的字符串集合的规则时,通常我们说该字符串和该正则表达式所匹配(match)。
最简单的正则表达式是单个字面意思的字符。例如a、b、c、1、2、3这样的字符,不同于*+?()|
这样的元字符,非元字符表示他们本身。也就是模式(pattern)串"a"仅仅匹配字符串"a"。换句话说,该模式串描述的字符串集合仅仅表示集合{"a"},仅此而已。如果我们想要表示元字符本身,使用转义字符\
。例如我们可以使用\+
来表示字面意思的+
字符。因此,如果我们想要匹配\
本身,那么需要使用\\
。
正则表达式之间可以做一定的运算从而形成新的正则表达式。这样的运算包括alternated或者concatenated。假如e1
能够匹配到s
并且e2
能够匹配t
。那么e1|e2
同s
或者t
匹配,而e1e2
同st
匹配。
元字符*
,+
和?
用来表示操作的重复运算。e1*
能够匹配到一连串的(零次或零次以上,匹配到的字符有可能不同,但是都在该模式描述的字符串集合里)字符串。同理的,e1+
匹配一次或者一次以上,e1?
描述零次或者一次的匹配。
上述元字符的运算遵循一定的优先级规则。从最弱到最强的绑定,分别为alternation,之后为concatenation,最后是重复运算符。显时的括号可以用来强制改变运算顺序。例如:表达式ab|cd
同表达式(ab)|(cd)
表示相同的意思,而ab*
同表达式a(b*)
意思相同。
截止目前介绍的语法,同传统的Unix egrep正则表达式语法保持一致。这一子集已经能够基本上描述所有的正则语言了。不严格的讲,正则表达式能够表示特定的字符串集合,通过使用有限容量的内存,单趟就能够完成匹配。在其他的一些编程语言里,例如Perl,添加了一些新的操作或者转义序列,他们有的使正则表达式更简介直观了,但有些也使得表达式更晦涩难懂了,但这些新的操作转移序列都没有使正则表达式(实现)更强大。