Manpages

______________________________________________________________________________

NAME

re_syntax - Tcl 正 则 表 达 式 的 语 法 。 _________________________________________________________________

描 述 DESCRIPTION

一 个 正 则 表 达 式 (regular expression ) 描 述 了 一 类 字 符 串 。 它 是 匹 配 特 定 字 符 串 而 不 匹 配 其 他 的 字 符 串 的 一 个 模 式 。

RE 的 不 同 风 格 DIFFERENT FLAVORS OF REs

正 则 表 达 式 (“RE”)由 POSIX 定 义 , 有 两 种 风 格 (flavor): 扩 展 RE(’’EREs’’)和 基 本 RE(’’BREs’’)。 ERE 粗 略 的 相 当 于 传 统 的 egrep 的 正 则 表 达 式 , 而 BRE 粗 略 的 相 当 于 传 统 的 ed 的 正 则 表 达 式 。 这 个 实 现 增 加 了 第 三 种 风 格 , 高 级 RE(’’AREs’’), 它 基 本 上 是 ERE 再 加 上 一 些 重 要 的 扩 展 。 译 注 : grep 缺 省 支 持 BRE, 通 过 指 定 -E 选 项 来 支 持 ERE, 历 史 上 的 egrep 和 fgrep 已 经 合 并 入 grep 中 。 ed、 sed 支 持 BRE, lex、 AWK 支 持 ERE。 这 个 手 册 页 主 要 描 述 ARE。 提 供 BRE 主 要 是 为 了 在 一 些 老 程 序 中 反 向 (backward)兼 容 ; 它 们 将 最 后 讨 论 。 POSIX ERE 基 本 上 是 ARE 的 一 个 真 子 集 。 在 ERE 中 不 存 在 的 ARE 的 特 征 将 被 指 示 出 来 。

正 则 表 达 式 的 语 法 REGULAR EXPRESSION SYNTAX

实 现 Tcl 正 则 表 达 式 使 用 了 Henry Spencer 写 的 包 , 基 于 POSIX 1003.2 规 定 和 一 些 (不 是 全 部 ) Perl5 扩 展 (感 谢 Henry!)。 下 面 的 许 多 正 则 表 达 式 描 述 是 原 封 不 动 的 从 他 的 手 册 页 复 制 过 来 的 。 译 注 : Perl5 的 正 则 表 达 式 也 是 从 Henry Spencer 所 写 的 包 演 变 而 来 。 一 个 ARE 是 一 个 或 多 个 由 ’|’分 隔 的 分 支 (branch)(构 成 的 ), 它 匹 配 与 任 何 一 个 分 支 匹 配 的 一 个 字 符 序 列 。 一 个 分 支 是 零 或 多 个 串 联 起 来 的 约 束 (constraint)或 定 量 原 子 (quantified atom)(构 成 的 )。 它 与 每 个 构 件 (约 束 或 定 量 原 子 )所 匹 配 的 任 何 字 符 序 列 的 一 个 串 联 相 匹 配 , 组 成 这 个 字 符 序 列 的 串 联 的 第 一 个 字 符 序 列 与 这 个 分 支 的 第 一 个 构 件 相 匹 配 , 第 二 个 字 符 序 列 与 第 二 个 构 件 相 匹 配 , 以 此 类 推 。 一 个 空 分 支 匹 配 空 串 。 一 个 定 量 原 子 是 可 能 跟 随 一 个 单 一 的 定 量 符 (quantifier) 的 原 子 。 不 加 定 量 符 , 它 匹 配 这 个 原 子 的 一 个 匹 配 。 定 量 符 和 它 所 定 量 的 原 子 的 匹 配 如 下 :

* 零 个 或 多 个 这 个 原 子 的 匹 配 的 一 个 序 列

+ 一 个 或 多 个 这 个 原 子 的 匹 配 的 一 个 序 列

? 零 个 或 一 个 这 个 原 子 的 匹 配 的 一 个 序 列

{m} 严 格 的

m 个 这 个 原 子 的 匹 配 的 一 个 序 列

{m,}

m 或 更 多 个 这 个 原 子 的 匹 配 的 一 个 序 列

{m,n}

mn (包 括 二 者 )个 这 个 原 子 的 匹 配 的 一 个 序 列 ; m 不 能 超 过 n

*? +? ?? {m}? {m,}? {m,n}? 不 贪 婪 的 (non-greedy) 定 量 符 , 它 匹 配 与 上 面 相 同 的 可 能 性 , 但 偏 好 最 小 字 符 数 而 不 是 最 大 字 符 数 的 匹 配 (参 见 MATCHING 匹 配 )。 使 用 {} 的 形 式 叫 做 束 缚 (bound)。 数 mn 是 无 符 号 十 进 制 整 数 , 允 许 的 值 从 0 到 255(包 括 0 及 255)。 原 子 是 下 列 之 一 :

(re)

(这 里 的 re 是 任 何 正 则 表 达 式 ) 匹 配 对 re 的 一 个 匹 配 , 为 可 能 的 报 告 而 记 录 (最 长 和 最 短 的 )匹 配 译 注 : 使 用 圆 括 号 来 组 合 原 子 。 例 如 , ab* 被 识 别 为 原 子 a 和 原 子 b 的 闭 包 b* 的 串 联 a(b)*, 而 不 是 原 子 a 和 原 子 b 的 串 联 ab 的 闭 包 (ab)*。 捕 获 的 意 思 是 把 在 圆 括 号 中 的 子 表 达 式 所 匹 配 的 字 符 序 列 保 存 下 来 , 由 后 续 的 后 引 用 去 使 用 。

(?:re) 同 上 , 但 不 报 告 (设 置 为 “非 捕 获 ”的 圆 括 号 )

() 匹 配 一 个 空 串 , 为 可 能 的 报 告 而 记 录

(匹 配 )

(?:) 匹 配 一 个 空 串 , 不 报 告

[chars] 一 个 方 括 号 表 达 式 (bracket expression) , 匹 配 chars 中 的 任 何 一 个 字 符 (详 情 参 见 BRACKET EXPRESSIONS 方 括 号 表 达 式 )

. 匹 配 任 何 单 一 字 符

\k

(这 里 的 k 是 一 个 非 alphanumeric (字 母 或 数 字 )字 符 ), 匹 配 被 接 受 为 普 通 字 符 的 这 个 字 符 , 例 如 , \\ 匹 配 一 个 反 斜 杠 字 符

\c

(这 里 的 c 是 一 个 alphanumeric 字 符 (可 能 跟 随 着 其 他 字 符 )), 一 个 转 义 (escape)(专 属 ARE), 参 见 后 面 的 ESCAPES 转 义 )

{

当 跟 随 着 不 是 数 字 的 一 个 字 符 的 时 候 , 匹 配 左 花 括 号 字 符 ’{’; 在 跟 随 着 一 个 数 字 的 时 候 , 它 是 一 个 束 缚 的 开 始 (参 见 前 面 )

x

这 里 x 是 没 有 其 他 意 义 的 一 个 单 一 字 符 , 匹 配 这 个 字 符 。 约 束 (constraint) 在 指 定 条 件 满 足 的 时 候 匹 配 一 个 空 串 。 一 个 约 束 不 能 跟 随 一 个 定 量 符 。 简 单 的 约 束 如 下 ; 其 他 的 在 以 后 的 ESCAPES 转 义 章 节 中 介 绍 。 译 注 : 约 束 的 术 语 叫 锚 定

^ 匹 配 一 行 的 开 始

$ 匹 配 一 行 的 结 束

(?=re) 正 前 行

(positive lookahead) (专 属 ARE), 匹 配 任 何 与 re 相 匹 配 的 子 串 的 开 始 端 点

(?!re) 负 前 行

(negative lookahead) (专 属 ARE), 匹 配 任 何 不 与 re 相 匹 配

的 子 串 的 开 始 端 点 前 行 约 束 不 能 包 括 后 引 用 (参 见 后 面 ), 并 且 其 中 的 所 有 圆 括 号 被 认 为 是 非 捕 获 的 。 一 个 RE 不 能 结 束 于 ’\’.

方 括 号 表 达 式 BRACKET EXPRESSIONS

一 个 方 括 号 表 达 式 是 一 个 在 ’[]’中 包 围 的 一 个 列 表 。 它 通 常 匹 配 列 表 中 的 任 意 一 个 单 一 字 符 (参 见 后 面 )。 如 果 这 个 列 表 以 “^”为 开 始 , 它 匹 配 不 属 于 这 个 列 表 剩 余 部 分 的 任 意 一 个 单 一 字 符 (参 见 后 面 )。 如 果 在 这 个 列 表 中 的 两 个 字 符 被 ’-’分 割 , 这 是 在 归 并 序 列 (collating sequence)中 这 两 个 字 符 之 间 (包 括 二 者 )的 字 符 的 完 整 范 围 的 简 写 , 例 如 , [0-9] 在 ASCII 中 匹 配 任 何 十 进 制 数 字 。 两 个 范 围 不 能 共 享 同 一 个 端 点 , 比 如 a-c-e 是 非 法 的 。 范 围 是 很 依 赖 于 整 理 序 列 的 , 可 移 植 程 序 应 该 避 免 依 靠 它 们 。 译 注 : 整 理 元 素 -- 用 来 确 定 字 符 或 宽 字 符 字 符 串 的 逻 辑 次 序 的 最 小 实 体 。 一 个 整 理 元 素 的 组 成 要 么 是 一 个 单 一 字 符 , 要 么 是 被 整 理 为 一 个 实 体 的 两 个 或 更 多 字 符 。 由 当 前 地 域 (locale)中 的 LC_COLLATE 类 属 的 值 确 定 整 理 元 素 的 当 前 设 置 。 译 注 : 整 理 序 列 -- 当 前 地 域 中 的 LC_COLLATE 类 属 的 设 置 确 定 整 理 元 素 的 相 对 次 序 。 这 个 字 符 次 序 定 义 所 有 整 理 元 素 的 相 对 位 置 , 在 这 个 次 序 中 每 个 元 素 都 占 有 一 个 唯 一 的 位 置 。 要 在 这 个 列 表 中 包 括 一 个 文 字 的 ] 或 者 - , 最 简 单 的 方 法 是 把 它 包 围 在 [..] 中 使 它 成 为 一 个 整 理 元 素 (见 后 )。 可 替 代 的 , 使 它 成 为 第 一 个 字 符 (跟 随 在 可 能 的 ’^’的 后 面 ), 或 (专 属 ARE) 加 以 ’\fR’先 导 。 可 选 的 , 对 于 ’-’, 使 它 成 为 最 后 的 字 符 , 或 一 个 范 围 的 第 二 端 点 。 要 使 用 一 个 文 字 - 作 为 一 个 范 围 的 开 始 端 点 , 可 以 使 它 成 为 一 个 整 理 元 素 或 (专 属 ARE) 加 以 ’\’先 导 。 除 了 这 些 例 外 、 一 些 使 用 [ (参 见 下 段 )的 组 合 、 和 转 义 , 在 一 个 方 括 号 表 达 式 中 的 所 有 其 他 特 殊 字 符 失 去 其 特 殊 意 义 。 在 一 个 方 括 号 表 达 式 当 中 , 在 [..] 当 中 包 围 一 个 归 并 元 素 (collating element)(一 个 字 符 、 一 个 多 字 符 序 列 被 整 理 为 如 同 一 个 单 一 字 符 , 或 给 二 者 的 一 个 整 理 序 列 名 字 )表 示 这 个 整 理 元 素 的 一 个 字 符 序 列 。 这 个 序 列 是 这 个 方 括 号 表 达 式 列 表 中 的 一 个 单 一 元 素 。 在 有 多 字 符 整 理 元 素 的 地 域 中 , 一 个 方 括 号 表 达 式 可 以 匹 配 多 于 一 个 字 符 。 所 以 (潜 藏 的 ), 即 使 在 方 括 号 表 达 式 中 未 出 现 多 字 符 整 理 元 素 , 以 ^ 为 开 始 的 一 个 方 括 号 表 达 式 仍 可 以 匹 配 多 字 符 整 理 元 素 ! (注 意 : Tcl 目 前 没 有 多 字 符 整 理 元 素 。 这 些 信 息 只 是 用 来 解 释 概 念 。 ) 例 如 , 假 定 整 理 序 列 包 含 一 个 ch 多 字 符 整 理 元 素 , 则 RE [[.ch.]]*c (后 面 跟 随 着 c的 零 或 多 个 ch) 匹 配 ’chchcc’的 最 先 的 5个 字 符 。 还 有 [^c]b 匹 配 整 个 ’chb’(因 为 [^c] 匹 配 多 字 符 ch)。 在 一 个 方 括 号 表 达 式 中 , 在 [==] 当 中 包 含 的 一 个 整 理 元 素 是 一 个 equivalence class 等 价 类 , 表 示 等 价 于 这 个 整 理 元 素 的 所 有 整 理 元 素 的 字 符 序 列 , 包 括 它 自 身 。 (如 果 没 有 其 他 等 价 的 整 理 元 素 , 与 在 分 界 符 ’[.’和 ’.]’中 包 含 一 样 对 待 。 ) 例 如 , 如 果 o^ 是 一 个 等 价 类 的 成 员 , 则 ’[[=o=]]’、 ’[[=^=]]’、 和 ’[o^]’都 是 同 义 词 。 一 个 等 价 类 不 能 是 一 个 范 围 的 端 点 。 (注 意 : Tcl 目 前 只 实 现 了 Unicode 地 域 。 它 不 定 义 任 何 等 价 类 。 上 面 的 例 子 只 是 用 来 解 释 概 念 。 ) 在 一 个 方 括 号 表 达 式 中 , 在 [::] 中 包 含 的 一 个 character class 字 符 类 的 名 字 表 示 属 于 这 个 类 的 所 有 字 符 的 列 表 (不 是 所 有 整 理 元 素 !)。 标 准 字 符 类 有 :

alpha 一 个 字 母

upper

一 个 大 写 字 母

lower

一 个 小 写 字 母

digit

一 个 十 进 制 数 字

xdigit

一 个 十 六 进 制 数 字

alnum

一 个 alphanumeric (字 母 或 数 字 )

print

一 个 alphanumeric (同 于 alnum)

blank

一 个 空 格 或 tab 字 符

space

在 显 示 的 文 本 中 产 生 白 空 格 的 一 个 字 符

punct

一 个 标 点 字 符

graph

有 图 形 表 示 的 一 个 字 符

cntrl

一 个 控 制 字 符 一 个 地 域 可 以 提 供 其 他 的 字 符 类 。 (注 意 : Tcl 目 前 只 实 现 了 一 个 地 域 : Unicode 地 域 。 ) 一 个 字 符 类 不 能 用 做 一 个 范 围 的 端 点 。 方 括 号 表 达 式 有 两 个 特 殊 情 况 : 方 括 号 表 达 式 [[:<:]][[:>:]] 是 约 束 , 分 别 匹 配 在 一 个 字 开 始 处 和 结 束 处 的 空 串 。 定 义 一 个 字 为 既 没 有 前 导 的 又 没 有 尾 随 的 单 词 字 符 的 单 词 字 符 的 一 个 序 列 。 一 个 单 词 字 符 是 一 个 alnum 字 符 或 一 个 下 划 线 (_)。 这 些 特 殊 的 方 括 号 表 达 式 已 被 淘 汰 ; ARE 用 户 应 当 转 而 使 用 约 束 转 义 (见 后 )。

转 义 ESCAPES

转 义 (专 属 ARE), 它 以 \ 为 开 始 后 面 跟 随 着 一 个 字 母 字 符 , 存 在 一 些 变 体 : 字 符 录 入 (entry)、 类 简 写 、 约 束 转 义 、 和 后 引 用 。 在 ARE 中 , 跟 随 着 一 个 alphanumeric 字 符 但 不 约 束 一 个 有 效 转 义 的 \ 是 非 法 的 。 在 ERE 中 , 没 有 转 义 : 在 方 括 号 表 达 式 外 部 , 跟 随 着 一 个 alphanumeric 字 符 的 一 个 \ 仅 表 示 这 个 字 符 为 一 个 普 通 字 符 , 而 在 一 个 方 括 号 表 达 式 内 部 , \ 是 一 个 普 通 字 符 。 (后 者 是 在 ERE 和 ARE 之 间 的 一 个 实 际 上 的 不 兼 容 。 ) 字 符 录 入 转 义 (Character-entry escapes) (专 属 ARE) 的 存 在 简 便 了 在 RE 中 指 定 一 个 非 打 印 和 其 他 非 常 规 字 符 :

\a 警 报

(震 铃 )字 符 , 如 同 C 语 言

\b 退 格

, 如 同 C 语 言
\B

\ 的 同 义 词 , 在 有 多 层 反 斜 杠 处 理 的 一 些 应 用 中 用 来 减 少 双 反 斜 杠

\cX

(这 里 的 X 是 任 何 字 符 ) 字 符 的 低 端 5位 与 X 的 低 端 5位 相 同 , 而 其 他 位 全 是 零

\e

其 整 理 序 列 名 字 是 ’ESC’的 字 符 , 如 果 尝 试 失 败 , 这 个 字 符 有 八 进 制 值 033

\f

换 页 , 如 同 C 语 言
\n
换 行 , 如 同 C 语 言
\r
回 车 , 如 同 C 语 言
\t
水 平

tab, 如 同 C 语 言
\u
wxyz

(这 里 的 wxyz 是 严 格 的 四 个 十 六 进 制 数 字 ) 在 本 地 字 节 次 序 中 的 Unicode 字 符 U+wxyz

\Ustuvwxyz

(这 里 的 stuvwxyz 是 严 格 的 八 个 十 六 进 制 数 字 ) 保 留 给 假 定 的 某 种 扩 展 到 32位 的 Unicode

\v 垂 直

tab, 如 同 C 语 言

\xhhh

(这 里 的 hhh 是 十 六 进 制 数 字 的 任 意 序 列 ) 其 十 六 进 制 值 为 0xhhh 的 字 符 (不 管 使 用 了 多 少 十 六 进 制 数 字 它 都 是 一 个 单 一 字 符 )。

\0 其 值 为

0 的 字 符

\xy

(这 里 的 xy 是 严 格 的 两 个 八 进 制 数 字 , 并 且 不 是 一 个 后 引 用 (参 见 后 面 )) 其 八 进 制 值 为 0xy 的 字 符

\xyz

(这 里 的 xyz 是 严 格 的 两 个 八 进 制 数 字 , 并 且 不 是 一 个 后 引 用 (参 见 后 面 )) 其 八 进 制 值 为 0xyz的 字 符

十 六 进 制 数 字 是 ’0’-’9’, ’a’-’f’, 和 ’A’-’F’. 八 进 制 数 字 是 ’0’-’7’. 字 符 录 入 转 义 总 是 被 接 受 为 普 通 字 符 。 例 如 , \135 是 ASCII中 的 ]\135 不 终 结 一 个 方 括 号 表 达 式 。 但 是 要 小 心 , 一 些 应 用 (例 如 C 编 译 器 )在 正 则 表 达 式 包 得 到 它 们 之 前 要 自 己 解 释 这 些 序 列 , 这 可 能 就 要 求 写 两 次 (四 次 (quadrupling), 等 等 ) ’\’。 类 简 写 转 义 Class-shorthand escapes (专 属 ARE) 为 特 定 的 通 用 字 符 类 提 供 简 写 :

\d

[[:digit:]]

\s

[[:space:]]

\w

[[:alnum:]_] (注 意 有 下 划 线 )

\D

[^[:digit:]]

\S

[^[:space:]]

\W

[^[:alnum:]_] (注 意 有 下 划 线 )

W在 方 括 号 表 达 式 中 , 没 有 外 面 的 方 括 号 的 ’\d’, ’\s’, 和 ’\w’ , 还 有 ’\D’, ’\S’, 和 ’\W’ 都 是 非 法 的 。 (所 以 , 等 价 于 [a-c[:digit:]][a-c\d] 和 等 价 于 [a-c^[:digit:]][a-c\D] 是 非 法 的 ) 约 束 转 义 constraint escape (AREs only) 是 如 果 指 定 条 件 满 足 则 匹 配 空 串 的 一 个 约 束 , 它 被 写 成 一 个 转 义 :

\A 只 在 字 符 串 开 始 处 匹 配

(与 ’^’的 不 同 之 处 请 参 见 下 面 的 MATCHING 章

节 )

\m 只 在 一 个 字 开 始 处 匹 配

\M 在 一 个 字 的 结 束 处 匹 配

\y 只 在 一 个 字 的 开 始 处 或 结 束 处 匹 配

\Y 只 在 一 个 字 的 不 是 开 始 处 或 结 束 处 的 某 点 上 匹 配

\Z 只 在 一 个 字 符 串 的 结 束 处 匹 配

(与 ’$’的 不 同 之 处 请 参 见 下 面 的 MATCHING 章 节 )

\m

(这 里 的 m 是 一 个 非 零 数 字 )一 个 back reference 后 引 用 , 参 见 后 面

\mnn

(这 里 的 m 是 一 个 非 零 数 字 , 而 nn 是 一 些 更 多 的 数 字 , 并 且 十 进 制 值 mnn 不 大 于 目 前 为 止 闭 合 的 捕 获 圆 括 号 的 数 目 ) 一 个 后 引 用 , 参 见 下 面  

同 于 上 面 规 定 的 [[:<:]][[:>:]] , 字 定 义 为 既 没 有 前 导 的 又 没 有 尾 随 的 单 词 字 符 的 一 个 序 列 。 一 个 单 词 字 符 是 一 个 alnum 字 符 或 一 个 下 划 线 (_)。 在 方 括 号 表 达 式 中 , 约 束 转 义 是 非 法 的 。 一 个 后 引 用 (专 属 ARE) 匹 配 的 字 符 串 与 用 数 字 指 定 的 在 圆 括 号 中 的 子 表 达 式 所 匹 配 的 字 符 串 相 同 , 所 以 (例 如 ) ([bc])\1 匹 配 bbcc 而 不 是 ’bc’。 在 RE 中 , 子 表 达 式 必 须 全 部 在 后 引 用 的 前 面 。 以 前 导 的 圆 括 号 (左 圆 括 号 )的 次 序 给 子 表 达 式 编 号 。 非 捕 获 圆 括 号 不 定 义 子 表 达 式 。 译 注 : 后 引 用 是 原 属 BRE 的 特 征 , ERE 无 此 特 征 。 例 如 , 表 达 式 ^(.*)\1$ 匹 配 由 同 一 个 字 符 串 的 两 个 毗 连 的 出 现 组 成 的 一 行 , 而 表 达 式 (a)*\1 不 匹 配 a。 (a)(b)\1 匹 配 aba, (a)(b)\2 匹 配 abb, (a(b))\1 匹 配 abab, (a(b))\2 匹 配 abb。 (a)\1 等 价 于 a{2,2}。 在 八 进 制 字 符 录 入 转 义 和 后 引 用 之 间 有 一 个 历 史 遗 留 的 二 义 性 , 只 能 象 上 面 提 示 的 那 样 用 启 发 式 的 方 法 来 解 决 。 一 个 前 导 的 零 总 是 指 示 一 个 八 进 制 转 义 。 一 个 单 一 的 非 零 数 字 , 不 跟 随 着 其 他 数 字 , 总 是 接 受 为 一 个 后 引 用 。 不 以 一 个 零 为 开 始 的 一 个 多 数 字 序 列 如 果 在 一 个 合 适 的 子 表 达 式 后 面 , 则 被 接 受 为 一 个 后 引 用 (比 如 给 出 的 后 引 用 的 序 号 在 合 法 范 围 内 ), 否 则 被 接 受 为 一 个 八 进 制 转 义 。

元 语 法 METASYNTAX

除 了 上 面 描 述 的 主 要 的 语 法 之 外 , 还 可 获 得 特 殊 形 式 和 杂 项 的 一 些 语 法 性 的 设 施 。 一 般 通 过 应 用 相 关 的 方 式 指 定 使 用 的 RE 的 风 格 。 但 是 , 可 以 用 指 示 符 (director)来 屏 弃 它 们 。 如 果 某 种 风 格 的 一 个 RE 以 ’***:’为 开 始 , 则 RE 的 剩 余 部 分 是 一 个 ARE。 如 果 某 种 风 格 的 一 个 RE 以 ’***=’为 开 始 , 则 RE 的 剩 余 部 分 被 接 受 为 一 个 文 字 串 , 并 且 其 中 的 所 有 字 符 被 认 为 是 普 通 字 符 。 一 个 ARE 可 以 以 embedded options 嵌 入 选 项 为 开 始 : 一 个 序 列 (?xyz) (这 里 的 xyz 是 一 个 或 更 多 的 字 母 字 符 ) 指 定 影 响 RE 剩 余 部 分 的 选 项 。 它 们 提 供 和 屏 弃 由 应 用 指 定 的 任 何 选 项 。 可 获 得 的 选 项 字 母 有 :

b

RE 的 剩 余 部 分 是 一 个 BRE

c

大 小 写 敏 感 (通 常 是 缺 省 的 )
e

RE 的 剩 余 部 分 是 一 个 ERE

i

大 小 写 不 敏 感 (参 见 下 面 的 MATCHING 匹 配 )
m
历 史 上 的 n 的 同 义 词

n 换 行 敏 感 匹

配 (参 见 下 面 的 MATCHING 匹 配 )

p 部 分 换 行 敏 感 匹

配 (参 见 下 面 的 MATCHING 匹 配 )
q

RE 的 剩 余 部 分 是 一 个 文 字 (被 引 用 起 来 的 ’’quoted’’)字 符 串 , 都 是 普 通 字 符

s

非 换 行 敏 感 匹 配 (通 常 是 缺 省 的 )
t
紧 凑 语 法 (通 常 是 缺 省 的 ; 参 见 后 面 )

w 反 向 部 分 换

行 敏 感 (离 奇 的 ’’weird’’) 匹 配 (参 见 下 面 的 MATCHING 匹 配 )

x

展 开 语 法 (参 见 后 面 ) 嵌 入 选 项 影 响 的 序 列 被 ) 终 结 。 它 们 只 在 一 个 ARE 的 开 始 处 有 效 , 此 后 不 可 以 在 其 中 使 用 。 除 了 通 常 的 (紧 凑 ) RE 语 法 , 其 中 所 有 字 符 都 有 意 义 , 还 有 一 个 展 开 语 法 , 在 所 有 风 格 的 RE 中 都 可 以 使 用 -expanded 开 关 来 获 得 它 , 或 者 在 ARE 中 使 用 嵌 入 的 x 选 项 。 在 展 开 语 法 中 , 忽 略 白 空 格 和 在 # 和 随 后 的 换 行 (或 RE 结 束 )之 间 的 所 有 字 符 , 这 就 允 许 了 在 一 个 复 杂 的 RE 中 进 行 分 段 和 注 释 。 有 对 这 些 基 本 规 则 的 三 个 例 外 : 保 留 有 前 导 ’\’的 白 空 格 或 ’#’ 保 留 在 方 括 号 表 达 式 中 的 白 空 格 或 ’#’ 在 多 字 符 符 号 如 ARE ’(?:’ 或 ’\(’ 中 间 的 白 空 格 或 注 释 是 非 法 的 展 开 语 法 中 的 白 空 格 是 blank、 tab 、 和 属 于 空 格 字 符 类 的 任 何 字 符 。 最 后 , 在 ARE 中 , 在 方 括 号 表 达 式 外 面 , 序 列 ’(?#ttt)’ (这 里 的 ttt 是 不 包 含 ’)’ 的 任 何 文 本 ) 是 一 个 注 释 , 它 将 被 完 全 忽 略 。 同 样 , 不 允 许 它 在 多 字 符 符 号 如 ’(?:’中 间 的 出 现 。 这 种 注 释 是 历 史 产 物 而 不 是 很 有 用 的 设 施 , 它 的 使 用 被 淘 汰 了 ; 应 使 用 展 开 语 法 来 替 代 。 如 果 应 用 (或 一 个 启 始 的 ***= 指 示 符 )指 定 用 户 的 输 入 被 作 为 一 个 文 字 串 而 不 是 一 个 RE 来 对 待 , 则 不 能 获 得 这 些 元 语 法 扩 展 。

匹 配 MATCHING

译 注 : 下 述 引 自 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继 续 匹 配 字 符 串 的 开 始 和 结 束 。 如 果 指 定 了 部 分 换 行 敏 感 , 这 将 致 使 . 和 方 括 号 表 达 式 成 为 换 行 敏 感 匹 配 , 但 不 影 响 ^ 和 ’$’。 如 果 指 定 了 反 向 部 分 换 行 敏 感 , 这 将 致 使 ^$ 成 为 换 行 敏 感 匹 配 , 但 不 影 响 . 和 方 括 号 。 这 不 是 很 有 用 , 提 供 它 只 是 为 了 对 称 。

限 制 和 兼 容 性 LIMITS AND COMPATIBILITY

对 于 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 并 行 的 检 查 所 有 可 能 的 匹 配 , 并 且 它 们 的 性 能 在 很 大 程 度 上 不 敏 感 于 它 们 的 复 杂 性 ), 而 为 故 意 的 找 寻 非 最 长 或 最 短 的 一 个 匹 配 而 开 发 的 查 找 次 序 需 要 重 写 。 )

基 本 正 则 表 达 式 BASIC REGULAR EXPRESSIONS

BRE 在 一 些 方 面 与 ERE 有 所 区 别 。 ’|’, ’+’, 和 ? 是 普 通 字 符 并 且 没 有 与 之 等 价 的 功 能 。 用 于 束 缚 的 分 界 符 是 \{ 和 ’\}’, 而 {} 本 身 是 普 通 字 符 。 用 于 嵌 套 子 表 达 式 的 圆 括 号 是 \( 和 ’\)’, 而 () 自 身 是 普 通 字 符 。 除 了 在 RE 或 一 个 圆 括 号 中 的 子 表 达 式 的 开 始 处 之 外 , ^ 是 一 个 普 通 字 符 , 除 了 在 RE 或 一 个 圆 括 号 中 的 子 表 达 式 的 结 束 处 之 外 , $ 是 一 个 普 通 字 符 , 而 在 RE 或 一 个 圆 括 号 中 的 子 表 达 式 的 开 始 处 之 外 出 现 的 * 是 一 个 普 通 字 符 (在 可 能 的 前 导 ’^’ 之 后 )。 最 后 , 可 获 得 单 一 数 字 的 后 引 用 , \<\> 分 别 是 [[:<:]][[:>:]] 的 同 义 词 ; 没 有 其 他 可 获 得 的 转 义 。

参 见 SEE ALSO

RegExp(3), regexp(n), regsub(n), lsearch(n), switch(n), text(n)

关 键 字 KEYWORDS

match, regular expression, string

[中 文 版 维 护 人 ]

寒 蝉 退 士

[中 文 版 最 新 更 新 ]

2001/10/26

《 中 国 Linux 论 坛 man 手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh