RE 的 剩 余
部 分 是 一 个 BRE
大 小 写
敏 感 (通 常 是 缺
省 的 )
e
RE 的
剩 余 部 分 是 一
个 ERE
大 小 写
不 敏 感 (参 见 下
面 的 MATCHING 匹 配 )
m 历 史 上 的 n 的
同 义 词
配 (参 见
下 面 的 MATCHING 匹 配 )
配 (参 见
下 面 的 MATCHING 匹 配 )
q
RE 的
剩 余 部 分 是 一
个 文 字 (被 引 用
起 来 的
’’quoted’’)字 符
串 , 都 是 普 通
字 符
非 换 行
敏 感 匹 配 (通 常
是 缺 省 的 )
t 紧 凑 语 法 (通 常
是 缺 省 的 ; 参
见 后 面 )
行 敏 感
(离 奇 的
’’weird’’) 匹 配
(参 见 下 面 的 MATCHING
匹 配 )
展 开 语
法 (参 见 后 面 ) 嵌
入 选 项 影 响 的
序 列 被 ) 终 结
。 它 们 只 在 一
个 ARE 的 开 始 处 有
效 , 此 后 不 可
以 在 其 中 使 用
。 除 了 通 常 的
(紧 凑 ) RE 语 法 , 其
中 所 有 字 符 都
有 意 义 , 还 有
一 个 展 开 语 法
, 在 所 有 风 格
的 RE 中 都 可 以 使
用 -expanded 开 关 来
获 得 它 , 或 者
在 ARE 中 使 用 嵌 入
的 x 选 项 。 在 展
开 语 法 中 , 忽
略 白 空 格 和 在
# 和 随 后 的 换
行 (或 RE 结 束 )之 间
的 所 有 字 符 ,
这 就 允 许 了 在
一 个 复 杂 的 RE 中
进 行 分 段 和 注
释 。 有 对 这 些
基 本 规 则 的 三
个 例 外 : 保 留 有
前 导 ’\’的 白
空 格 或 ’#’ 保
留 在 方 括 号 表
达 式 中 的 白 空
格 或 ’#’ 在 多
字 符 符 号 如 ARE
’(?:’ 或 ’\(’
中 间 的 白 空 格
或 注 释 是 非 法
的 展 开 语 法 中
的 白 空 格 是 blank、
tab 、 和 属 于 空 格
字 符 类 的 任 何
字 符 。 │ 最
后 , 在 ARE 中 , 在
方 括 号 表 达 式
外 面 , 序 列
’(?#ttt)’ (这
里 的 ttt 是 不 包
含 ’)’ 的 任 何
文 本 ) 是 一 个 注
释 , 它 将 被 完
全 忽 略 。 同 样
, 不 允 许 它 在
多 字 符 符 号 如
’(?:’中 间 的 出
现 。 这 种 注 释
是 历 史 产 物 而
不 是 很 有 用 的
设 施 , 它 的 使
用 被 淘 汰 了 ;
应 使 用 展 开 语
法 来 替 代 。 如
果 应 用 (或 一 个
启 始 的 ***= 指 示
符 )指 定 用 户 的
输 入 被 作 为 一
个 文 字 串 而 不
是 一 个 RE 来 对 待
, 则 不 能 获 得
这 些 元 语 法 扩
展 。
译 注 :
下 述 引 自 XBD RE 规 定
中 的 匹 配 定 义
, 略 有 变 更 。
译 注 : 零 个 或
多 个 字 符 的 一
个 序 列 被 称 为
与 RE 匹 配 的 条 件
是 在 这 个 序 列
中 的 字 符 对 应
于 这 个 模 式 定
义 的 一 个 字 符
序 列 。 译 注 :
对 一 个 匹 配 的
序 列 的 查 找 开
始 于 一 个 字 符
串 的 开 始 处 ,
停 止 于 找 到 第
一 个 匹 配 字 符
串 的 时 候 , 这
里 定 义 第 一 个
的 意 思 为 “字 符
串 中 最 早 开 始
的 ”。 如 果 模 式
允 许 匹 配 的 字
符 有 可 变 的 数
目 , 因 此 在 这
个 点 开 始 的 序
列 多 于 一 个 ,
则 匹 配 最 长 的
那 个 序 列 。 例
如 : RE bb* 匹 配 abbbc 中 的
第 2到 第 4个 字 符
, 而 RE (wee|week)(knights|night) 匹
配 weeknights 的 所 有 10个
字 符 。 译 注 :
与 整 个 匹 配 是
最 长 的 最 左 匹
配 相 一 致 , 从
左 到 右 的 每 个
子 模 式 , 匹 配
最 长 的 可 能 的
字 符 串 。 为 此
, 一 个 空 串 被
认 为 比 根 本 没
有 匹 配 长 。 例
如 , 针 对 (against) abcdef
匹 配 RE (.*).* ,子 表 达
式 (1) 是 abcdef, 而 针
对 bc 匹 配 RE (a*)*, 子
表 达 式 (1) 是 空 串
。 译 注 : 通 过
向 每 个 子 表 达
式 递 归 的 提 供
最 左 最 长 匹 配
来 确 定 什 么 (子
)字 符 串 对 应 于
子 表 达 式 是 可
能 的 , 而 附 带
条 件 是 整 体 匹
配 是 最 左 的 、
最 长 的 。 例 如
, 针 对 acdacaaa 匹 配
(ac*)c*d[ac]*1 匹 配 出 acdacaaa (这
里 1=a); 而 简 单 的
给 (ac*) 匹 配 最 长 的
将 生 成 1=ac, 但 整
体 匹 配 将 变 小
(acdac)。 概 念 上 , 实
现 必 须 检 查 每
种 可 能 的 匹 配
, 并 在 生 成 的
最 左 最 长 的 总
体 匹 配 中 , 为
最 左 子 表 达 式
挑 出 一 个 最 长
的 匹 配 (子 串 )并
以 此 类 推 。 注
意 , 这 意 味 着
子 表 达 式 的 匹
配 是 上 下 文 相
关 的 : 在 一 个 很
大 的 RE 中 的 一 个
子 表 达 式 所 匹
配 的 字 符 串 可
能 与 它 作 为 一
个 独 立 的 RE 时 不
同 , 还 有 , 即
使 在 类 似 的 字
符 序 列 中 , 在
同 一 个 很 大 的 RE
中 的 同 一 个 子
表 达 式 的 两 个
实 例 可 能 匹 配
不 同 的 长 度 。
例 如 , 在 RE (a.*b)(a.*b) 中
, 两 个 完 全 相
同 的 子 表 达 式
将 分 别 的 匹 配
accbaccccb 的 四 个 和 六
个 字 符 。 如 果
一 个 RE 能 匹 配 一
个 给 定 字 符 串
中 的 多 于 一 个
的 子 串 , RE 匹 配
在 这 个 字 符 串
中 最 先 开 始 的
子 串 。 如 果 RE能
匹 配 的 在 这 一
点 上 开 始 的 子
串 多 于 一 个 ,
它 的 选 择 决 定
于 它 的 偏 好
(preference): 要 么 是 最 长
的 子 串 , 要 么
是 最 短 的 子 串
。 多 数 原 子 和
所 有 约 束 , 都
没 有 偏 好 。 一
个 有 圆 括 号 的 RE
与 RE 有 相 同 的 偏
好 (有 可 能 没 有
)。 一 个 有
{m} 或 {m}?
定 量 符 的 定 量
原 子 与 原 子 自
身 有 相 同 的 偏
好 (有 可 能 没 有
)。 一 个 有 其 他
平 常 的 定 量 符
的 定 量 原 子 (包
括 在 {m,n}
中 m 等 于 n) 偏
好 最 长 的 匹 配
。 一 个 有 不 贪
婪 定 量 符 的 定
量 原 子 (包 括 在
{m,n}? 中 m
等 于 n 的 情 况 )
偏 好 最 短 的 匹
配 。 一 个 分 支
与 在 它 的 里 面
的 第 一 个 定 量
原 子 有 相 同 的
偏 好 。 用 | 操
作 符 连 接 起 来
的 一 个 由 两 个
或 多 个 分 支 组
成 的 RE 偏 好 最 长
的 匹 配 。 取 决
于 匹 配 整 个 RE 的
规 则 所 强 加 的
约 束 , 基 于 可
能 子 串 的 表 现
, 子 表 达 式 可
以 匹 配 最 长 或
最 短 的 可 能 子
串 , 在 RE 中 开 始
较 早 的 子 表 达
式 优 先 于 开 始
较 晚 的 。 注 意
, 外 部 的 子 表
达 式 优 先 于 其
中 的 构 件 子 表
达 式 。 注 意 ,
可 以 分 别 的 使
用 定 量 符 {1,1} 和
{1,1}? 在 子 表 达 式
或 整 个 RE 上 强 制
最 长 和 最 短 偏
好 。 用 字 符 数
而 不 是 整 理 元
素 数 来 测 量 匹
配 长 度 。 一 个
空 串 被 当 作 比
根 本 没 有 匹 配
长 , 例 如 bb* 匹
配 ’abbbc’中 间
的 三 个 字 符 ,
(week|wee)(night|knights) 匹 配
’weeknights’的 所 有
10个 字 符 , 在 针
对 (against) abc 匹 配
(.*).* 的 时 候 圆 括
号 中 的 子 表 达
式 匹 配 所 有 这
三 个 字 符 , 而
在 针 对 bc 匹 配
(a*)* 的 时 候 整 个 RE
和 圆 括 号 中 子
表 达 式 都 匹 配
一 个 空 串 。 如
果 指 定 了 大 小
写 无 关 匹 配 ,
效 果 如 同 所 有
字 母 的 大 小 写
区 别 都 消 失 了
。 当 存 在 大 小
写 区 别 的 一 个
字 符 在 方 括 号
表 达 式 外 面 作
为 一 个 普 通 字
符 出 现 的 时 候
, 它 被 有 效 的
转 变 成 包 含 大
小 写 二 者 的 一
个 方 括 号 表 达
式 , 所 以 x 变
成 了 ’[xX]’。 当
它 出 现 在 一 个
方 括 号 表 达 式
中 , 把 它 对 应
的 所 有 大 小 写
添 加 到 方 括 号
中 , 所 以 [x] 变
成 [xX]而 [^x] 变 成
’[^xX]’。 如 果
指 定 了 换 行 敏
感 匹 配 , 则 .
和 使 用 ^ 的 方
括 号 表 达 式 永
不 匹 配 换 行 字
符 (所 以 除 非 RE 显
式 安 排 , 否 则
永 不 会 跨 越 换
行 来 进 行 匹 配
), 并 且 ^ 和 $
除 了 分 别 匹 配
字 符 串 的 开 始
和 结 束 之 外 ,
还 分 别 的 匹 配
在 换 行 之 后 和
之 前 的 空 串 。 ARE
0继 续 只 匹 配
字 符 串 的 开 始
和 结 束 。 如 果
指 定 了 部 分 换
行 敏 感 , 这 将
致 使 . 和 方 括
号 表 达 式 成 为
换 行 敏 感 匹 配
, 但 不 影 响 ^
和 ’$’。 如 果
指 定 了 反 向 部
分 换 行 敏 感 ,
这 将 致 使 ^ 和
$ 成 为 换 行 敏
感 匹 配 , 但 不
影 响 . 和 方 括
号 。 这 不 是 很
有 用 , 提 供 它
只 是 为 了 对 称
。
对 于 RE 的
长 度 没 有 强 加
特 定 的 限 制 。
想 要 高 度 可 移
植 的 程 序 不 应
该 依 赖 比 256 字 节
长 的 RE, 因 为 遵
从 POSIX 的 实 现 可 能
拒 绝 接 受 这 样
的 RE。 专 属 ARE 并 且
实 际 上 与 POSIX ERE 不
相 容 的 特 征 是
在 方 括 号 表 达
式 中 的 \ 不 失
去 它 的 特 殊 意
义 。 所 有 其 他 ARE
特 征 使 用 的 语
法 在 POSIX ERE 中 是 非
法 的 , 或 着 有
未 定 义 或 未 指
定 的 效 果 ; 指
示 符 的 *** 语 法
同 样 不 属 于 BRE 和
ERE 二 者 的 POSIX 语 法
。 许 多 ARE 扩 展 取
自 Perl, 为 了 整 理
它 们 而 进 行 了
一 些 变 更 , 还
有 一 些 Perl 扩 展 未
提 供 。 要 注 意
的 不 相 容 包 括
: ’\b’、
’\B’, 缺 乏 对
尾 随 的 换 行 的
特 殊 对 待 , 为
受 换 行 敏 感 匹
配 影 响 的 RE 增 加
了 方 括 号 表 达
式 补 全 , 在 先
行 约 束 中 对 圆
括 号 和 后 引 用
的 限 制 , 和 最
长 /最 短 匹 配 的
匹 配 语 义 。 自
从 这 个 包 的 一
个 早 期 的 beta 测 试
版 本 做 了 变 更
以 来 , RE 的 匹 配
的 规 则 包 含 正
常 的 和 非 贪 婪
的 定 量 符 二 者
。 (新 规 则 更 加
简 单 和 清 晰 ,
而 不 在 猜 测 用
户 的 真 实 意 图
上 费 很 大 力 气
。 )
Henry Spencer
的 原 始 的 1986 regexp
包 , 仍 被 广 泛
的 使 用 (例 如 ,
在 Tcl 8.1 之 前 的 发
行 中 ), 它 实 现
了 今 天 的 ERE 的 一
个 早 期 版 本 。
在 regexp 的 近 似 ERE
(简 写 为 RRE)和 ARE 之
间 有 四 点 不 相
容 : In roughly increasing order of
significance: 在 ARE 中 , 跟
随 着 一 个 字 母
字 符 的 \ 要 么
是 转 义 要 么 是
一 个 错 误 , 而
在 RRE 中 , 它 只 是
写 字 母 的 另 一
种 方 式 。 这 不
应 该 是 一 个 问
题 , 因 为 在 RRE 中
没 有 理 由 写 出
这 样 的 一 个 序
列 。 在 ARE 中 跟 随
着 一 个 数 字 的
{ 是 一 个 束 缚
的 开 始 , 而 在 RRE
中 , { 总 是 一
个 普 通 字 符 。
这 样 的 序 列 是
少 见 的 , 并 且
经 常 导 致 一 个
错 误 , 原 因 是
随 后 的 字 符 看
起 来 不 象 一 个
有 效 的 束 缚 。
在 ARE 中 , 在
’[]’内 \ 保 持
是 一 个 特 殊 字
符 , 所 以 在
’[]’内 一 个 文
字 \ 必 须 写 成
’\\’。 在 RRE 中
, 在 []内 ’\\’
也 给 出 一 个 文
字 \, 但 只 有
真 正 的 偏 执 狂
程 序 员 才 例 行
公 事 的 双 写 反
斜 杠 。
ARE 为 RE
报 告 最 长 的 和
最 短 的 匹 配 ,
而 不 是 按 指 定
的 查 找 次 序 找
到 的 第 一 个 匹
配 。 这 可 能 影
响 寄 希 望 于 第
一 个 匹 配 不 被
报 告 的 一 些 RRE。
(废 弃 了 为 快 速
匹 配 而 优 化 查
找 次 序 的 RRE 细 致
工 艺 (ARE 并 行 的 检
查 所 有 可 能 的
匹 配 , 并 且 它
们 的 性 能 在 很
大 程 度 上 不 敏
感 于 它 们 的 复
杂 性 ), 而 为 故
意 的 找 寻 非 最
长 或 最 短 的 一
个 匹 配 而 开 发
的 查 找 次 序 需
要 重 写 。 )
BRE 在
一 些 方 面 与 ERE 有
所 区 别 。 ’|’,
’+’, 和 ? 是 普
通 字 符 并 且 没
有 与 之 等 价 的
功 能 。 用 于 束
缚 的 分 界 符 是
\{ 和 ’\}’, 而
{ 和 } 本 身 是
普 通 字 符 。 用
于 嵌 套 子 表 达
式 的 圆 括 号 是
\( 和 ’\)’, 而
( 和 ) 自 身 是
普 通 字 符 。 除
了 在 RE 或 一 个 圆
括 号 中 的 子 表
达 式 的 开 始 处
之 外 , ^ 是 一
个 普 通 字 符 ,
除 了 在 RE 或 一 个
圆 括 号 中 的 子
表 达 式 的 结 束
处 之 外 , $ 是
一 个 普 通 字 符
, 而 在 RE 或 一 个
圆 括 号 中 的 子
表 达 式 的 开 始
处 之 外 出 现 的
* 是 一 个 普 通
字 符 (在 可 能 的
前 导 ’^’ 之 后
)。 最 后 , 可 获
得 单 一 数 字 的
后 引 用 , \< 和
\> 分 别 是 [[:<:]]
和 [[:>:]] 的 同 义
词 ; 没 有 其 他
可 获 得 的 转 义
。
RegExp(3),
regexp(n), regsub(n), lsearch(n), switch(n), text(n)
match, regular
expression, string
寒 蝉 退
士
2001/10/26
http://cmpp.linuxforum.net
本 页 面
中 文 版 由 中 文 man
手 册 页 计 划 提
供 。 中 文 man 手 册
页 计 划 :
https://github.com/man-pages-zh/manpages-zh
|