5.3 基本概念

正则表达式的构造方式类似算术表达式,通过各种操作组合子(更小的)表达式,整个表达式匹配一个或多个字符17。大多数字符,包括所有的字母和数字,是匹配自身的正则表达式。元字符 . \ | ( ) [ { ^ $ * + ? 需要转义才能表达其自身的含义,转义的方式是在元字符前面添加反斜杠,如要表达点号 . 需要使用 \.。要注意,它们是否有特殊意义取决于所在的内容。

一个字符集 (character class) 是用一对中括号[]括起来的字符列表,用来匹配列表中的任意单个字符,除非列表中的第一个字符是 ^,它用来匹配不在这个列表中的字符。 [0123456789] 用来匹配任意单个数字,[^abc] 用来匹配除字符 a,b,c 以外的任意字符。字符范围 (character ranges) 可以通过第一个和最后一个字符指定, 中间用连字符 (hyphen) 连接, 由于这种解释依赖于区域和具体实现,所以指定字符范围的使用方式最好避免。唯一可移植(便携,通用)的方式是作为字符集,在列表中列出所有的 ASCII 字母, [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz].

预定义的一些字符类,它们的解释依赖于当前的语言区域,下面是 POSIX locale 环境下的解释

  • [:alnum:] 表示 [:alpha:][:digit:],含义是 [0-9A-Za-z],但是前者与区域和字符集无关,后者依赖于当前的区域设置和字符编码。要注意在这些字符集名 class names 中,中括号 [] 是符号名的一部分,是必须要包含的。在字符集中,大多数元字符失去它们特殊的意义。

  • [:alpha:] 表示 [:lower:][:upper:]

  • [:blank:] 表示 空格 space 制表符 tab

  • [:cntrl:] 表示控制符,在 ASCII 字符集里里,这些字符有八进制代码,从 000 到 037,和 177(DEL)。

  • [:digit:] 表示数字 0,1,2,3,4,5,6,7,8,9

  • [:graph:] 表示 [:alnum:][:punct:].

  • [:lower:] 表示当前区域下的小写字母

  • [:print:] 表示可打印的字符 [:alnum:], [:punct:] 和空格.

  • [:punct:] 表示标点字符

    ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~`
  • [:space:] 表示空格字符: 水平制表符 tab, 换行符 newline,垂直制表符 vertical tab,换页符 form feed,回车符 carriage return,空格符 space

  • [:xdigit:] 表示 16 进制数字 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.

要包含字面的 ] 就把它放在列表的开头,类似地,要包含字面 ^,除了开头可以放在任意位置。要包含字面 - 把它放在开头或者结尾。只有 ^ - \ ] 在字符集内是有特殊的含义

点号 . 匹配任意单个字符,\w 匹配一个词 word 字符(是[[:alnum:]_]的同义词,一个扩展) ,而 \W\w 取反,意味着 [^[:alnum:]_]\d, \s, \D\S 表示数字和空格类和它们的取反

脱字符 caret ^ 和美元符号 $ 是元字符,分别匹配一行的开头和结尾。符号 \<\> 分别匹配一个词的开头和结尾的空字符串。\b 匹配词边缘的空字符串,\B 匹配不在词边缘的空字符串。 词 word 的解释依赖于区域和实现。


  1. useBytes = TRUE 表示把字符看作字节。字符、字节和比特的关系是,一个字节 byte 八个比特 bit,一个英文字符 character 用一个字节表示,而一个中、日、韩文字符需要两个字节表示↩︎