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
|