NAME
regex - POSIX 1003.2 正 则 表 达 式
DESCRIPTION
正 则 表 达 式 (’’RE’’s), 在 POSIX 1003.2 中 定 义 , 包 含 两 种 类 型 : 新 式 REs (基 本 上 指 的 是 egrep 使 用 的 那 些 , 1003.2 称 其 为 ’’extended’’ REs 也 就 是 “ 扩 展 的 REs”) 和 旧 式 REs (指 的 是 ed(1) 中 的 那 些 , 1003.2 称 之 为 ’’basic’’ REs 也 就 是 “基 本 的 REs”). 旧 式 REs 的 存 在 仅 仅 是 为 了 向 后 和 一 些 旧 程 序 保 持 兼 容 ; 在 最 后 将 加 以 讨 论 。 1003.2 对 RE 语 法 和 语 义 的 某 些 方 面 没 有 做 强 制 规 定 ; ’(!)’ 记 号 标 示 了 这 些 内 容 , 它 们 可 能 不 能 完 全 移 植 到 其 他 1003.2 实 现 当 中 。 一 个 (新 式 的 ) RE 正 则 表 达 式 是 一 个 (!) 或 多 个 非 空 (!) branches 分 支 , 以 ’|’ 分 隔 。 它 匹 配 任 何 匹 配 其 中 一 个 分 支 的 符 号 串 。 一 个 branch 分 支 是 一 个 (!) 或 多 个 pieces 片 段 连 结 而 成 。 符 号 串 首 先 要 匹 配 它 的 第 一 个 片 段 , 接 下 来 剩 余 部 分 再 匹 配 第 二 个 片 段 , 以 此 类 推 。 一 个 piece 片 段 是 一 个 atom 原 子 , 其 后 可 能 包 含 一 个 (!) ’*’, ’+’, ’?’, 或 者 bound 量 词 。 一 个 原 子 加 上 ’*’ 匹 配 零 个 或 多 个 这 个 原 子 的 匹 配 构 成 的 序 列 。 一 个 原 子 加 上 ’+’ 匹 配 一 个 或 多 个 这 个 原 子 的 匹 配 构 成 的 序 列 。 一 个 原 子 加 上 ’?’ 匹 配 零 个 或 一 个 这 个 原 子 的 匹 配 。 一 个 bound 量 词 是 ’{’ 后 面 跟 一 个 无 符 号 十 进 制 整 数 , 可 能 还 会 跟 一 个 ’,’, 可 能 还 会 再 跟 一 个 无 符 号 十 进 制 整 数 , 然 后 以 ’}’ 结 束 。 整 数 的 大 小 必 须 在 0 和 RE_DUP_MAX (255(!)) 之 间 (包 含 边 界 值 )。 如 果 给 出 了 两 个 数 字 , 那 么 第 一 个 决 不 能 比 第 二 个 大 。 一 个 原 子 的 量 词 中 如 果 只 有 一 个 数 字 而 没 有 逗 号 的 话 , 就 匹 配 i 个 这 个 原 子 的 匹 配 构 成 的 序 列 。 一 个 原 子 的 量 词 中 如 果 只 有 一 个 数 字 并 且 有 逗 号 的 话 , 就 匹 配 i 个 或 多 个 这 个 原 子 的 匹 配 构 成 的 序 列 。 一 个 原 子 的 量 词 中 如 果 包 含 两 个 数 字 i 和 j 的 话 , 就 匹 配 i 到 j 个 这 个 原 子 的 匹 配 构 成 的 序 列 。 一 个 原 子 是 一 个 包 含 在 ’()’ 中 的 正 则 表 达 式 (这 将 匹 配 这 个 正 则 表 达 式 匹 配 的 符 号 串 ), 一 个 空 的 ’()’ (匹 配 空 串 ), 一 个 bracket expression (方 括 号 表 达 式 , 参 见 下 面 ), ’.’ (匹 配 任 何 字 符 ), ’^’ (匹 配 行 首 的 空 字 符 串 ), ’$’ (匹 配 行 尾 的 空 字 符 串 ), 一 个 ’\’ 加 上 下 列 字 符 之 一 ’^.[$()|*+?{\’ (匹 配 这 个 字 符 , 忽 略 它 的 任 何 特 殊 意 义 ), 一 个 ’\’ (加 上 任 何 其 他 字 符 (!) 匹 配 那 个 字 符 , 忽 略 它 的 任 何 特 殊 意 义 , 就 好 像 ’\’ 不 存 在 (!)), 或 者 是 一 个 字 符 , 没 有 特 殊 意 义 (匹 配 它 本 身 )。 一 个 ’{’ 后 面 是 一 个 非 数 字 的 字 符 时 , 是 一 个 普 通 的 字 符 而 不 是 量 词 的 开 始 (!)。 以 ’\’ 来 结 束 一 个 RE 是 非 法 的 。 一 个 bracket expression 方 括 号 表 达 式 是 一 个 字 符 的 列 表 , 包 含 在 ’[]’ 当 中 。 它 一 般 匹 配 列 表 中 的 任 何 一 个 字 符 (有 特 殊 情 况 )。 如 果 这 个 列 表 以 ’^’ 开 始 , 它 将 匹 配 不 在 列 表 中 的 任 何 字 符 (下 面 还 会 讲 到 特 殊 情 况 )。 如 果 列 表 中 的 两 个 字 符 以 ’-’ 分 隔 , 可 以 表 示 字 母 表 中 这 两 个 字 符 之 间 (包 括 这 两 个 字 符 )所 有 的 字 符 。 例 如 , ASCII 字 符 表 中 ’[0-9]’ 匹 配 任 何 数 字 。 不 能 (!) 用 一 个 字 符 作 为 定 义 两 个 字 符 范 围 的 端 点 , 就 像 这 样 ’a-c-e’。 字 符 范 围 是 与 字 母 表 顺 序 相 关 的 , 可 移 植 的 程 序 不 应 使 用 它 们 。 要 在 列 表 中 包 含 一 个 字 面 的 (没 有 特 殊 含 义 的 ) ’]’, 可 以 把 它 放 在 首 位 (后 面 可 能 要 加 上 一 个 ’^’)。 要 在 列 表 中 包 含 一 个 字 面 的 ’-’, 可 以 把 它 放 在 首 位 或 末 尾 , 或 者 让 它 作 为 一 个 字 符 范 围 的 末 端 点 。 要 以 一 个 字 面 的 ’-’ 作 为 字 符 范 围 的 起 始 , 可 以 将 它 放 在 ’[.’ 和 ’.]’ 当 中 , 使 得 它 成 为 一 个 collating element (归 并 元 素 , 参 见 下 面 )。 特 殊 情 况 除 了 这 些 , 还 有 使 用 ’[’ 的 组 合 (参 见 下 一 段 )。 所 有 其 他 特 殊 字 符 , 包 括 ’\’ 在 内 , 在 方 括 号 表 达 式 中 都 失 去 了 它 们 的 特 殊 含 义 。 方 括 号 表 达 式 中 , 一 个 包 含 在 ’[.’ 和 ’.]’ 中 的 归 并 元 素 (collating element, 一 个 字 符 , 一 个 视 为 一 体 的 字 符 序 列 , 或 者 一 个 代 表 着 上 述 两 类 的 归 并 序 列 名 称 ) 代 表 着 这 个 归 并 元 素 所 包 含 的 字 符 序 列 。 这 个 序 列 被 视 为 方 括 号 表 达 式 的 一 个 元 素 。 因 此 一 个 包 含 着 多 字 符 归 并 元 素 的 方 括 号 表 达 式 可 以 匹 配 多 于 一 个 的 字 符 。 例 如 , 如 果 这 个 归 并 序 列 包 含 一 个 归 并 元 素 ’ch’, 那 么 正 则 表 达 式 ’[[.ch.]]’*c’ 可 以 匹 配 ’chchcc’ 的 前 五 个 字 符 。 方 括 号 表 达 式 中 , 一 个 包 含 在 ’[=’ 和 ’=]’ 中 的 归 并 元 素 是 一 个 等 价 类 , 代 表 着 等 价 于 它 的 所 有 归 并 元 素 (也 包 括 它 自 身 )包 含 的 字 符 的 序 列 。 (如 果 没 有 其 他 等 价 的 归 并 元 素 , 就 把 它 与 括 号 分 隔 符 是 ’[.’ 和 ’.]’ 时 同 样 看 待 。 ) 例 如 , 如 果 o 和 ^ 是 一 个 等 价 类 的 成 员 , 那 么 ’[[=o=]]’, ’[[=^=]]’ 还 有 ’[o^]’ 都 是 同 义 词 。 一 个 等 价 类 不 能 (!) 是 一 个 字 符 范 围 的 末 端 点 。 方 括 号 表 达 式 中 , 包 含 在 ’[:’ 和 ’:]’ 中 的 一 个 character class(字 符 类 ) 代 表 着 这 个 字 符 类 中 的 所 有 字 符 的 列 表 。 标 准 的 字 符 类 名 称 是 :
alnum |
digit |
punct | ||
alpha |
graph |
space | ||
blank |
lower |
upper | ||
cntrl |
|
xdigit 它 们 代 表 着 wctype(3) 定 义 的 字 符 类 。 一 个 locale(语 言 环 境 ) 可 能 会 提 供 其 他 字 符 类 。 一 个 字 符 类 不 能 用 作 一 个 字 符 范 围 的 末 端 点 。 方 括 号 表 达 式 还 有 两 种 特 殊 的 情 况 (!) : 方 括 号 表 达 式 ’[[:<:]]’ 和 ’[[:>:]]’ 分 别 匹 配 一 个 词 的 开 始 和 结 尾 的 空 字 符 串 。 一 个 word (词 )是 一 个 word character (成 词 字 符 ) 的 序 列 , 并 且 前 后 都 没 有 成 词 字 符 。 一 个 word character (成 词 字 符 ) 是 一 个 alnum 字 符 (在 wctype(3) 中 有 定 义 ) 或 者 是 一 个 下 划 线 。 这 是 一 个 扩 展 , 与 POSIX 1003.2 兼 容 但 没 有 写 入 正 文 , 在 需 要 移 植 到 其 他 系 统 中 的 软 件 中 应 当 小 心 使 用 。 如 果 一 个 RE 可 以 匹 配 一 个 字 符 串 的 多 个 不 同 的 字 串 时 , RE 选 择 匹 配 最 前 面 的 一 个 。 如 果 这 个 RE 匹 配 的 子 串 有 相 同 的 起 始 点 , RE 选 择 匹 配 最 长 的 一 个 。 子 表 达 式 也 匹 配 最 长 的 字 串 , 使 得 整 个 匹 配 的 字 串 最 长 , RE 中 前 面 的 子 表 达 式 比 后 面 的 子 表 达 式 优 先 级 高 。 注 意 高 级 的 子 表 达 式 比 组 成 它 的 子 表 达 式 优 先 级 要 高 。 匹 配 长 度 以 字 符 来 计 算 , 而 不 是 归 并 元 素 。 空 字 符 串 被 认 为 比 没 有 匹 配 要 长 。 例 如 , ’bb*’ 匹 配 ’abbbc’ 的 中 间 三 个 字 符 ; ’(wee|week)(knights|nights)’ 匹 配 ’weeknights’ 的 全 部 十 个 字 符 ; ’(.*).*’ 匹 配 ’abc’, 其 中 括 号 中 的 子 表 达 式 匹 配 所 有 这 三 个 字 符 ; ’(a*)*’ 来 和 ’bc’ 匹 配 时 , 括 号 中 的 子 表 达 式 和 整 个 RE 都 匹 配 空 字 符 串 。 如 果 指 定 了 case-indepentent 忽 略 大 小 写 的 匹 配 , 效 果 是 字 母 表 中 的 大 小 写 区 别 似 乎 都 消 失 了 。 如 果 一 个 字 母 可 能 以 两 种 情 况 出 现 , 假 如 它 出 现 在 方 括 号 表 达 式 之 外 , 实 际 上 被 替 换 成 了 一 个 包 含 所 有 情 况 的 方 括 号 表 达 式 , 例 如 ’x’ 成 为 了 ’[xX]’; 如 果 它 出 现 在 方 括 号 表 达 式 之 内 , 那 么 它 的 所 有 形 式 都 被 加 入 到 这 个 方 括 号 表 达 式 之 内 , 因 此 例 如 ’[x]’ 等 同 于 ’[xX]’, 还 有 ’[^x]’ 成 为 了 ’[^xX]’。 对 RE 的 长 度 没 有 强 制 的 限 制 。 需 要 可 移 植 的 程 序 不 应 当 使 用 长 于 256字 节 的 正 则 表 达 式 , 因 为 特 定 的 实 现 可 以 不 接 受 这 种 RE, 但 是 仍 然 是 POSIX 兼 容 的 。 过 时 的 (’’basic’’) 正 则 表 达 式 在 很 多 地 方 有 不 同 之 处 。 ’|’, ’+’ 和 ’?’ 是 普 通 的 字 符 , 并 且 没 有 和 它 们 等 价 的 功 能 。 量 词 的 分 隔 符 是 ’\{’ 和 ’\}’, ’{’ 和 ’}’ 本 身 是 普 通 的 字 符 。 嵌 套 的 子 表 达 式 使 用 的 括 号 是 ’\(’ 和 ’\)’, ’(’ 和 ’)’ 本 身 是 普 通 的 字 符 。 ’^’ 是 一 个 普 通 的 字 符 , 除 非 是 RE 的 第 一 个 字 符 , 或 者 (!) 一 个 括 号 中 的 子 表 达 式 的 第 一 个 字 符 。 ’$’ 是 一 个 普 通 的 字 符 , 除 非 是 RE 的 最 后 一 个 字 符 , 或 者 (!) 一 个 括 号 中 的 子 表 达 式 的 最 后 一 个 字 符 。 ’*’ 是 一 个 普 通 的 字 符 , 如 果 它 出 现 在 RE 的 开 始 , 或 者 一 个 括 号 中 的 子 表 达 式 的 开 始 (其 后 一 般 是 一 个 ’^’)。 最 后 , 还 有 一 类 atom 原 子 , 一 个 back reference(向 后 引 用 ): ’\’ 其 后 跟 一 个 非 零 十 进 制 整 数 d, 匹 配 与 第 d 个 括 号 中 的 子 表 达 式 的 匹 配 相 同 的 内 容 (子 表 达 式 的 编 号 是 根 据 它 们 的 左 括 号 而 来 , 从 左 到 右 )。 因 此 (例 如 ), ’\([bc]\)\1’ 匹 配 ’bb’ 或 ’cc’ 但 是 不 匹 配 ’bc’。 |
SEE ALSO 参 见
POSIX 1003.2, section 2.8 (Regular Expression Notation).
BUGS
同 时 使 用 两 种 REs 是 不 明 智 的 。 目 前 的 1003.2 规 约 称 , 如 果 右 括 号 ’)’ 没 有 对 应 的 ’(’ 那 么 视 为 普 通 字 符 ; 这 个 规 定 是 一 个 笔 误 , 将 来 会 改 正 。 避 免 使 用 它 。 向 后 引 用 是 糟 糕 的 设 计 , 是 高 效 的 实 现 中 要 面 对 的 主 要 问 题 。 另 外 还 会 产 生 晦 涩 的 语 法 (? ’a\(\(b\)*\2\)*d’ 可 以 匹 配 ’abbbd’ 吗 ? )。 避 免 使 用 它 们 。
1003.2 对 于 忽 略 大 小 写 的 匹 配 的 规 定 也 不 明 确 。 上 面 给 出 的 定 义 ’’one case implies all cases’’ 是 当 前 各 实 现 者 的 共 识 , 被 当 作 正 确 的 语 法 。 词 边 界 的 语 法 丑 陋 得 让 人 难 以 接 受 。
AUTHOR 作 者
This page was taken from Henry Spencer’s regex package.
[中 文 版 维 护 人 ]
袁 乙 钧 <bbbush [AT] 163.com>
[中 文 版 最 新 更 新 ]
2004.02.24
《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh