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 的解释依赖于区域和实现。
useBytes = TRUE
表示把字符看作字节。字符、字节和比特的关系是,一个字节 byte 八个比特 bit,一个英文字符 character 用一个字节表示,而一个中、日、韩文字符需要两个字节表示↩︎