2.1. 字面量字符(Literal Characters)
最基础的正则表达式由一个字面量字符组成,例如a
。它将匹配一个字符串中第一个a
出现的位置。如果它匹配的是Jack is a boy
,那么它将匹配到J后面的a。事实上即使a出现在字符串的中间也不影响这个正则,如果你想控制a是否出现在字符串的开头或者结尾,那么你需要使用文字边界。我们会在后面的章节展开讨论。
事实上这个正则同样可以匹配字符串中的第二个a
,但是你必须通过函数调用通知正则引擎开始第二次匹配。
相类似的,表达式\cat\
可以匹配About cats and dogs
中的cat
。这个表达式由三个字面量字符组成,对于正则引擎而言,它的意义是:查找一个c
它的后面紧接着一个a
,a
的后面紧接着一个t
。
注意:在默认情况下,正则引擎的大小写敏感的。除非你要素引擎忽略大小写。
2.2 元字符
为了处理更复杂的正则匹配,我们需要把一些字符作为特殊字符使用。以下列出正则表达式中的12个元字符:
\
^
&
.
|
?
*
+
(
)
[
{
通常来说,这些特殊字符在单独使用时会引发错误。
如果你想把以上的字符作为字面量字符来使用,你必须使用\
进行转义。例如,如果你想匹配1+1=2
,那么正确的表达式为/1\+1=2/
,因为加号有特殊的含义。
注意:
/1+1=2/
也是一个正确的表达式,但是它不会匹配1+1=2
,它会匹配到123+111=234
的111=2
。这是由于加号这个特殊字符导致的。
如果你忘记对元字符进行转义,那么在有些情况下会导致正则表达式非法,例如/+1/
。这时程序会抛出异常。
2.2.1 {
的转义
在大多数正则引擎中,我们可以直接把{
作为字面量字符使用,除了作为重复操作使用例如a{1,3}
。所以在一般情况下我们不需要对{
进行转义,当然转义也不会报错。在一些特殊的正则引擎中,我们可能需要对它进行转义,例如在java中,}
需要转义,在Boost和std::regex中{
、}
都需要转义。
2.2.2 ]
的转义
]
在字符类以外的情况下使用时,它是一个字面量字符。在字符类中使用的时候,则有不同的规则。具体的规则我们会在字符类专题的展开讨论。
当然也有例外,在
std::regex
和Ruby
中]
即使不在字符类中也需要转义。
2.2.3 其它字符
除了以上这些元字符以外,其它的字符都不需要使用反斜杠转义。这是因为转移符和字面量字符的组合将成为一个正则指令(regex token),它具有特殊的含义。例如\d
可以匹配0~9中任意一个字符。
2.3. 特殊字符与编程语言
在正则表达式中'
和"
并不是特殊字符,如何你是一个程序员的话你一定对此十分意外。在你编程或是使用文本编辑器的高级搜索功能时,你不需要对单引号和双引号进行转义。
当你在代码中使用正则表达式的时候,你应当注意有些字符在你所使用的编程语言中有特殊的含义。这是因为这些字符在进入正则引擎之前,先要经过编译器的处理。在c++代码中,表达式1\+1=2
需要写成1\\+1=2
,c++编译器会在编译过程中去掉一个反斜杠,并把编译后的结果传递给正则引擎。再举一个例子,正则表达式c:\\temp
可以匹配字符串c:\temp
,但是在c++中你需要这么写c:\\\\temp
。简单来说就是用四个反斜杠代替一个正则中的斜杠。
有关正则在编程语言中的使用,我们对在后面的章节中展开讨论。
如果文章出现错误,请给我提Issues - -
Github地址