简介
文字字符
最基本的正则表达式包含一个单一的文字字符,例如a。它会去检查字符串,找出该字符第一次出现的位置,并返回该字符。如果有字符串'Jack is a boy'
,则匹配'J'之后的'a' 。这个'a'是否在单词中间的对于正则表达式引擎来说是无关紧要的。如果对我们而言很重要,则需要使用单词边界来告知正则表达式引擎。我们稍后再讲。
这个正则表达式也可以匹配第二个'a'。只有当我们告诉正则表达式引擎在第一个匹配项之后开始搜索字符串时,它才会去匹配。在文本编辑器中,可以使用其“查找下一个”或“向前搜索”功能进行操作。在编程语言中,通常存在一个单独的函数,我们可以调用该函数以在上一个匹配项之后继续搜索字符串。
同样,正则表达式cat
匹配字符串'there are many cats and dogs'
中的'cat'。此正则表达式由三个字符组成。这就像对正则表达式引擎说:找到'c' ,紧跟着找'a' ,再紧跟着't' 。
请注意,默认情况下,正则表达式引擎区分大小写。cat
与Cat
不匹配,除非我们告诉正则表达式引擎忽略大小写差异(可以使用 模式修饰符 来实现,这个后面会说到,请各位看官继续往下看)。
特殊的字符
因为我们要做的不只是简单地搜索文字文本,所以我们需要保留某些字符以供特殊使用。在不同的语言中,有12个具有特殊含义的字符:反斜杠\
,字符^
,符号$
,点.
,竖线符号|
,问号?
,星号*
,加号+
,左括号(
,右括号)
,方括号[
和左花括号{
,这些特殊字符通常称为“元字符”。这些元字符是不能单独使用的。如果要将这些字符中的任何一个用作正则表达式中的文字,则需要使用反斜杠对它们进行转义。如果要匹配3+6=9 ,则正确的正则表达式为3+6=9 。否则,是匹配不到的,因为加号具有特殊含义。
这里需要注意的是,省略了反斜杠的3+6=9是有效的正则表达式,并不是说不加反斜杠就有错误。只是说这与字符串3+6=9不匹配。它可以匹配出字符串3213+6336=9549中的336=9。这是由于+是有特殊含义的元字符。
大多数正则表达式都将花括号{视为正常的文本字符,除非它像{1,3}
一样是重复运算符的一部分。因此,我们通常不需要反斜杠即可转义花括号{,尽管我们可以根据需要进行转义。但是也有一些例外。Java要求使用文字大括号来进行转义。Boost和std :: regex要求所有大括号都转义。
]
是文字类外的文字。字符类内部适用不同的规则。关于字符类的主题将讨论这些内容。同样,也有例外。std::regex
和Ruby
要求即使在字符类之外也要使用方括号将其转义。
所有其他字符都不应以反斜杠转义。这是因为反斜杠也是一个特殊字符。反斜杠与文字字符的组合可以创建具有特殊含义的正则表达式标记符。例如,\d
匹配从0到9的单个数字。
特殊字符和编程语言
如果你是一名程序员,可能会对单引号和双引号等字符不是特殊字符感到惊讶。那是对的。当使用正则表达式或grep工具(如PowerGREP)或文本编辑器的搜索功能(如EditPad Pro)时,请勿像在编程语言中那样转义或重复引号字符。
在源代码中,我们必须记住编程语言会在字符串内对哪些字符进行特殊处理。那是因为这些字符是在regex库看到字符串之前由编译器处理的。因此,在C ++代码中,正则表达式3\+6=9
必须写为"3\\+6=9"
。C ++编译器将源代码中转义的反斜杠转换为传递给regex库的字符串中的单个反斜杠。要匹配c:\temp
,我们需要使用正则表达式c:\\temp
。作为C ++源代码中的字符串,此正则表达式变为 c:\\\\temp
。四个反斜杠实际上匹配一个反斜杠。这里的反斜杠可能看着有点迷糊,我们要知道,反斜杠是具有转义功能的,所以我们要匹配字符串中的反斜杠首先就要使反斜杠失去转义的功能,那就只能使用反斜杠来转义反斜杠。这些细节是需要我们平时多多练习的。