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