Skip to content

Latest commit

 

History

History
55 lines (37 loc) · 4.28 KB

002-字面量字符与元字符.md

File metadata and controls

55 lines (37 loc) · 4.28 KB

2.1. 字面量字符(Literal Characters)

最基础的正则表达式由一个字面量字符组成,例如a。它将匹配一个字符串中第一个a出现的位置。如果它匹配的是 Jack is a boy,那么它将匹配到J后面的a。事实上即使a出现在字符串的中间也不影响这个正则,如果你想控制a是否出现在字符串的开头或者结尾,那么你需要使用文字边界。我们会在后面的章节展开讨论。

事实上这个正则同样可以匹配字符串中的第二个a,但是你必须通过函数调用通知正则引擎开始第二次匹配。

相类似的,表达式cat可以匹配About cats and dogs中的cat。这个表达式由三个字面量字符组成,对于正则引擎而言,它的意义是:查找一个c它的后面紧接着一个aa的后面紧接着一个t

注意:在默认情况下,正则引擎的大小写敏感的。除非你要素引擎忽略大小写。

2.2 元字符

为了处理更复杂的正则匹配,我们需要把一些字符作为特殊字符使用。以下列出正则表达式中的12个元字符:

  • \
  • ^
  • &
  • .
  • |
  • ?
  • *
  • +
  • (
  • )
  • [
  • {

通常来说,这些特殊字符在单独使用时会引发错误。

如果你想把以上的字符作为字面量字符来使用,你必须使用\进行转义。例如,如果你想匹配1+1=2,那么正确的表达式为/1\+1=2/,因为加号有特殊的含义。

注意:/1+1=2/也是一个正确的表达式,但是它不会匹配1+1=2,它会匹配到123+111=234111=2。这是由于加号这个特殊字符导致的。

如果你忘记对元字符进行转义,那么在有些情况下会导致正则表达式非法,例如/+1/。这时程序会抛出异常。

2.2.1 {的转义

在大多数正则引擎中,我们可以直接把{作为字面量字符使用,除了作为重复操作使用例如a{1,3}。所以在一般情况下我们不需要对{进行转义,当然转义也不会报错。在一些特殊的正则引擎中,我们可能需要对它进行转义,例如在java中,}需要转义,在Booststd::regex{}都需要转义。

2.2.2 ]的转义

]字符类以外的情况下使用时,它是一个字面量字符。在字符类中使用的时候,则有不同的规则。具体的规则我们会在字符类专题的展开讨论。

当然也有例外,在std::regexRuby]即使不在字符类中也需要转义。

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地址

原文