Manpages

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 個 或 多 個 這 個 原 子 的 匹 配 構 成 的 序 列 。 一 個 原 子 的 量 詞 中 如 果 包 含 兩 個 數 字 ij 的 話 , 就 匹 配 ij 個 這 個 原 子 的 匹 配 構 成 的 序 列 。 一 個 原 子 是 一 個 包 含 在 ’()’ 中 的 正 則 表 達 式 (這 將 匹 配 這 個 正 則 表 達 式 匹 配 的 符 號 串 ), 一 個 空 的 ’()’ (匹 配 空 串 ), 一 個 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

print

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 參 見

regex(3)

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手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh