正则表达式(regular expression)简介
时间:2005-12-13 来源:xy-coordinate
Regular Expression 是一种字符串表达的方式. 使用者可使用一个简短的 Regular Expression 来表示“具有某特征” 或者“复杂难以描述”的所有字符串. 而日常数据处理中, 最常进行的工作是『从档案中找出具有某特征的字符串, 再加以处理(打印,置换, 计算...)』. 此时, Regular Expression 便可派上用场. 使用一个简短的 Regular Expression 便可完全指定需要加以处理的资料 , 避免反复判断找寻的困扰。
一、Why Regular Expression
Regular Expression 是一种字符串表达的方式. 使用者可使用一个简短的 Regular Expression 来表示“具有某特征” 或者“复杂难以描述”的所有字符串. 而日常数据处理中, 最常进行的工作是『从档案中找出具有某特征的字符串, 再加以处理(打印,置换, 计算...)』. 此时, Regular Expression 便可派上用场. 使用一个简短的 Regular Expression 便可完全指定需要加以处理的资料 , 避免反复判断找寻的困扰。
譬如: 若使用 MS-DOS 中文字编辑器 edit 的找寻功能, 可以找出档案中所有的“prg1.c”;但edit却无法一次同 时找寻字符串 “prg1.c”、”prg2.c” ... 或 “prg8.c”;必需反复执行八次找寻的动作. 可是在 UNIX 中的 vi , 使用一个 Regular Expression “ prg[0-8].c” 便可同时表示上述八个字符串, 如此一次就可找出指定的所有字符串.
可见 Regular Expression 确实十分便利. 然而MS-DOS下许多工具的设计并不支持解读 Regular Expression. 但 UNIX 环境下除了 vi 外, 还有许多工具都接受 Regular Expression, 如 : grep、sed、awk、csplit... . 使用这些工具时, 便可应用 Regular Expression 来指定欲找寻的字符串; 并可配合这些工具的其它功能将找寻到的数据进一步地加以处理.
Regular Expression 的特色是简短且表达力强. 它所表达的可以是某一特定的字符串, 也可以是具有某一共同特征的"所有"字符串(如上例). Regular Expression 中定义了一组特殊字符, 它们代表着某些特别的意义; 使用者可借助这些特殊字符来表示字符串的下列特征 :
描述组成字符串的元素(components) : 例如 : Regular Expression “[Tt]he” 代表字符串 “The” 或 “the”.
限制字符串出现的位置 : 例如 : Regular Expression “^The” 代表『出现于行首』的字符串 “The”.
由于 Regular Expression 具有极佳的字符串表示能力. 往后, 读者若能多利用 UNIX 上接受 Regular Expression 的工具, 且灵活应用 Regular Expression; 则可避免撰写程序进行复杂字符串判断(parsing) 的麻烦. 如此, 才能真正发挥各工具的的功能, 减轻数据处理时的负担, 并增加数据处理的效率.
----------------------------------------------------------------------------
Note 1:
UNIX中定义了数种字符串表达方式, Regular Expression 及 Extended Regular Expression 是常见的二种. 另一种是使用于Shell命令列, 将参数展开(expand)成文件名称的"Pattern Matching Notation", 这种表示法与 Regular Expressions 的语法差异较大, 甚至有数项用法相左, 故位未列入本文讨论以免读者混淆.
二、组成RE的元素
Regular Expression 是由普通字符及一组具有特殊意义 的字符所构成. 本节主要介绍各种特殊字符所代表的意义及 其用法. 读者学习时应留心 : 有时, 同一特殊字符, 会因出 现在字符串中不同的位置或连接其它特殊字符, 而有不同的意义. 本文中为有别于一般的字符串, 所有 Regular Expression 都以粗体字体表示, 且加注”Regexp”于其前方.
组成 Regular Expression 的元素及所代表的意义如下 :
普通字符:除了”.”、”[“、”]”、”*”、”+”、”?”、 “|”、”^”、”$”、”{“、”}”、””、 “<“、”>“、”(“、”)” 外之所有字符.
由普通字符所组成的 Regular Expression 其意义与原字符串字面意义相同. 例如:普通字符”A”也可当成一个 Regular Expression. Regexp “ A” 与一般字符”A”代表相同的意义.
Regexp “ the” 与一般字符串”the”代表相同的意义.
.Metacharacter 用以代表任意一个字符. 须留心 UNIX Shell 中使用”?”表示任意一个字符, 使用”*”代表任意长 度的字符串(这是另一种称为 “Pattern Matching Notation” 的字符串表示法). Regular Expression 中则使用” .” 来代表”一个”任意字符(注 意: 并非任意长度的字符串). 而 Regular Expression 中” *”另有 其它涵意, 并不代表任意长度的字符串. 例如
Regexp “ .” 可用以代表任意一个字符. 如 “A”、”1”、”+”、...
Regexp “ ...” 则代表一个由任意3个字符所的字符串. 譬如 “123”、”abc”、”# 1”、...
^:限制字符串必须出现于行首.
$:限制字符串必须出现于行末.
例如:Regexp “ ^The” 用以表示所有出现于行首的字符串”The”. Regexp “ The$” 用以表示所有出现于行末的字符串”The”. Regexp “ ^The$” 则用以表示一个仅含字符串”The”的数据列. Regexp “ ^$” 表示一个空白的数据列(行首与行尾之间未存在任一字符).
:将特殊字符还原成字面意义的字符. Regular Expression 中 特殊字符 将被解释成特定的意义. 若要表示特殊字符的字面(literal meaning) 意义时, 在 特殊字符之前加上 “” 即可.
例如:使用 Regular Expression 来表示字符串”a.out”时, 不可写成 Regexp “ a.out”. 因为” .”在 Regular Expression 中是特殊字符, 表示任一字符.
可合乎(match) Regexp “ a.out” 的字符串将不只 “a.out” 一个; 字符串”a2out”,”a3out”, “aaout”... 都合于 Regexp “ a.out”.
正确的表示法应为 : Regexp “ a.out”
“ ” 在 Regular Expression 中的另一个意 义是当成 Escape character.
例如:“ ” 用以表示 tab. “ ” 表示换行符号.
[...]:『字符集合』, 用以表示两中括号间 所有的字符当中的任一个.
例如:Regexp “ [123]” 可用以表示字符 “1”、”2” 或 “3”. Regexp “ [Tt]” 可用以表示字符 “T” 或 “t”. 所以, Regexp " [Tt]he" 表示字符串 "The" 或 "the". (注意 : 一个字符集合仅代表”一个”字符.)
使用时, 需留心字符集合 [ ] 内不可随意留空白.
例如: Regexp “[ Tt ]” 中括号内有空格符, 故除了可用 以表示字符”T”或”t”, 也可代表一个 “”(空格符).
- :字符集合中可使用 “ -” 来指定字符的区间, 其用法如下:
Regexp “ [0-9]” 等于 Regexp “ [0123456789]” 用以表示任意 "一个" 阿拉伯数字. 同理 Regexp “ [A-Z]” 用以表示任意 "一个" 大写英文字母.
但应留心 :
Regexp " [0-9a-z]" 并不等于 Regexp " [0-9][a-z]"; 前者表示一个字符(阿拉伯数字或小写英文字母), 后者表示二个字符.
Regexp " [-9]" 或 " [9-]"