名 前
regex − POSIX.2 正 規 表 現
説 明
正 規 表 現 (Regular expression: RE) は POSIX.2 で 定 義 さ れ て お り 、 二 つ の 形 式 が あ る 。 新 し い 正 規 表 現 (modern RE) と 古 い 正 規 表 現 (obsolete RE) で あ る 。 新 し い 正 規 表 現 は だ い た い egrep の も の と 同 じ で 、 POSIX.2 で は 「 拡 張 」 正 規 表 現 ("extended" RE) と 呼 ば れ て い る 。 古 い 正 規 表 現 は だ い た い ed(1) の も の と 同 じ で 、 POSIX.2 で は 「 基 本 」 正 規 表 現 ("basic" RE) で あ る 。 古 い 正 規 表 現 は 、 古 い プ ロ グ ラ ム と の 互 換 性 を 保 つ た め の も の で あ る 。 こ れ に つ い て は 最 後 に 議 論 す る 。 POSIX.2 で は 、 正 規 表 現 の 文 法 や 記 号 の 一 部 が 、 未 定 義 の ま ま 残 さ れ て い る 。 "(!)" は 、 こ の よ う な 意 味 で 、 他 の POSIX.2 の 実 装 と 完 全 に は 互 換 で な い か も 知 れ な い 部 分 で あ る 。
(新 し い ) 正 規 表 現 は 一 つ 以 上 (!) の 空 白 で な い 枝 (branch) か ら な る 。 枝 ど う し は '|' で 区 切 ら れ る 。 正 規 表 現 は 、 枝 の ど れ か に マ ッ チ (match) し た も の に マ ッ チ す る 。 枝 は 一 つ 以 上 の 文 節 (piece) が 結 合 さ れ た も の で あ る 。 枝 は 第 一 の 文 節 が マ ッ チ し 、 続 い て 第 二 の 文 節 が マ ッ チ し 、 ... し た も の に マ ッ チ す る 。 文 節 は ア ト ム (atom) か ら な る 。 た だ し ア ト ム の 後 に は 一 つ (!) の '*', '+', '?' あ る い は 繰 り 返 し 指 定 (bound) が 続 く こ と も あ る 。 '*' が 後 置 さ れ た ア ト ム は 、 マ ッ チ し た ア ト ム の 0 個 以 上 の 並 び に マ ッ チ す る 。 '+' が 後 置 さ れ た ア ト ム は 、 マ ッ チ し た ア ト ム の 1 個 以 上 の 並 び に マ ッ チ す る 。 '?' が 後 置 さ れ た ア ト ム は 、 マ ッ チ し た ア ト ム の 0 個 ま た は 1 個 に マ ッ チ す る 。 繰 り 返 し 指 定 と は '{' に 続 い て 、 符 号 な し 10 進 整 数 、 ','、 も う 一 つ の 10 進 整 数 、 '}' を 並 べ た も の で あ る 。 ',' と 二 つ め の 10 進 整 数 は 省 略 で き る 。 二 つ め の 10 進 整 数 だ け を 省 略 す る こ と も で き る (最 後 の ’}’ は 省 略 で き な い )。 整 数 は 0 以 上 RE_DUP_MAX (255(!)) 以 下 の 間 で 指 定 で き る 。 二 つ 指 定 す る 場 合 に は 、 最 初 の 数 値 は 後 の 数 値 を 越 え て は な ら な い 。 整 数 i だ け か ら な る 繰 り 返 し 指 定 を 後 置 さ れ た ア ト ム は 、 ア ト ム を ぴ っ た り ち ょ う ど i 個 だ け 並 べ た も の に マ ッ チ す る 。 整 数 i と コ ン マ が 指 定 さ れ た 繰 り 返 し 指 定 を 後 置 さ れ た ア ト ム は 、 ア ト ム を i個 以 上 並 べ た も の に マ ッ チ す る 。 整 数 i と j が 指 定 さ れ た 繰 り 返 し 指 定 を 後 置 さ れ た ア ト ム は 、 ア ト ム を i個 以 上 j 個 以 下 だ け 並 べ た も の に マ ッ チ す る 。 ア ト ム の 種 類 は 以 下 の 通 り 。 "()" に 囲 ま れ た 正 規 表 現 (そ の 正 規 表 現 が マ ッ チ す る 文 字 列 に マ ッ チ す る )、 中 身 が 空 の "()" (null 文 字 列 に マ ッ チ す る )(!)、 ブ ラ ケ ッ ト 表 現 (bracket expression :後 述 )、 '.' (任 意 の 1 文 字 に マ ッ チ す る )、 '^' (行 頭 の 空 白 文 字 に マ ッ チ す る )、 '$' (行 末 の 空 白 文 字 に マ ッ チ す る )、 '\' に "^.[$()|*+?{\" の い ず れ か 一 文 字 を 後 置 し た も の (通 常 の 文 字 と し て 扱 わ れ 、 そ の 文 字 に マ ッ チ す る )、 '\' に そ れ 以 外 の 文 字 を 後 置 し た も の (!) ('\' が な い 場 合 と 同 じ よ う に 、 そ の 文 字 に マ ッ チ す る (!))、 特 に 意 味 を 持 た な い 文 字 一 つ (そ の 文 字 に マ ッ チ す る )。 '{' は 数 字 以 外 の 文 字 が 後 置 さ れ る と 通 常 の 文 字 と し て 扱 わ れ 、 繰 り 返 し 指 定 の 始 ま り と は さ れ な い (!)。 '\' で 終 わ る 正 規 表 現 は 不 正 な も の と み な さ れ る 。 ブ ラ ケ ッ ト 表 現 は "[]" に よ っ て 閉 じ ら れ た 文 字 の リ ス ト で あ る 。 こ れ は 通 常 リ ス ト 中 に 存 在 し て い る 文 字 に マ ッ チ す る 。 (例 外 あ り 、 後 述 。 ) リ ス ト が '^' で 始 ま る と 、 ブ ラ ケ ッ ト 表 現 は リ ス ト に 存 在 し て い な い 文 字 一 つ に マ ッ チ す る (例 外 あ り 、 後 述 )。 リ ス ト 中 の 二 つ の 文 字 が '−' で 区 切 ら れ て い る 場 合 は 、 こ れ は 照 合 順 序 (collating sequence) で そ の 二 つ の 文 字 に 挟 ま れ る 、 す べ て の 文 字 の 並 び を 短 縮 し た も の と み な さ れ る (両 端 含 む )。 例 え ば "[0−9]" は ASCII で は 10 進 の 数 字 (digit) の い ず れ か に マ ッ チ す る 。 二 つ の 領 域 指 定 が 端 点 を 共 有 し て は な ら な い (!)。 つ ま り "a−c−e" の よ う な も の は 不 正 で あ る 。 領 域 指 定 は 照 合 順 序 に 強 く 依 存 す る 。 し た が っ て 移 植 性 の 高 い プ ロ グ ラ ム を 作 る 場 合 は 、 領 域 指 定 に は 頼 ら な い ほ う が 良 い だ ろ う 。 【 訳 注 : 照 合 順 序 (collating sequence) と い う の は 、 国 際 化 (Internationalization) に 関 連 し た 用 語 で す 。 ア ル フ ァ ベ ッ ト 順 に 単 語 を 並 べ る 際 に は 、 言 語 に よ っ て 並 べ る 基 準 が 異 な り ま す 。 照 合 順 序 は 、 そ の 差 異 を 吸 収 す る た め の 仕 組 み で す 。 例 え ば 、 ス ペ イ ン 語 で は ch と い う 文 字 並 び を 特 別 扱 い す る た め 、 ア ル フ ァ ベ ッ ト 順 が a, b, c, ch, d, e, ... の 順 に な る そ う で す 。 こ の よ う な シ ー ケ ン ス の こ と を collating sequence と 言 い ま す 。 こ の と き ’ch’ と い う 文 字 並 び は 、 単 語 整 列 の 際 に あ た か も 「 一 文 字 」 の よ う に 扱 わ れ ま す 。 こ こ で 、 順 序 付 け を 行 う 際 に 最 小 の 単 位 と な る 、 ’a’、 ’b’ の 文 字 や ’ch’ の よ う な 特 別 な 文 字 並 び な ど 、 照 合 順 序 の 要 素 の こ と を collating element と 言 い ま す 。 collating sequence は 、 文 字 単 位 で は な く collating element を 単 位 と し て 定 義 さ れ ま す 。 】 文 字 ']' そ の も の を リ ス ト に 入 れ た い 場 合 は 、 最 初 の 文 字 と し て 指 定 す れ ば 良 い ('^') の 後 に 続 け る の で も 良 い )。 文 字 '−' そ の も の を リ ス ト に 入 れ た い 場 合 は 、 最 初 か 最 後 の 文 字 と す れ ば 良 い 。 あ る い は 領 域 指 定 の 終 端 文 字 と し て 指 定 し て も 良 い 。 '−' を 領 域 指 定 の 先 頭 文 字 に 指 定 す る に は 、 "[." と ".]" で 囲 っ て 、 照 合 順 序 の 要 素 (collating element: 後 述 ) に す れ ば 良 い 。 他 の 特 殊 文 字 ( も 含 む ) は 、 ブ ラ ケ ッ ト 表 現 の 内 部 で は す べ て 通 常 の 文 字 と し て 扱 わ れ る 。 ブ ラ ケ ッ ト 表 現 の 内 部 で は 、 "[." と ".]" に 囲 わ れ た 照 合 順 序 の 要 素 は 、 そ の 要 素 に 対 応 す る 文 字 並 び を 表 す 。 「 照 合 順 序 の 要 素 」 と は 、 [1] 文 字 、 [2] 単 一 文 字 の よ う に 扱 わ れ る 複 数 文 字 の シ ー ケ ン ス 、 [3] 1, 2 い ず れ か に 対 応 す る 照 合 順 序 上 の 名 前 、 の い ず れ か で あ る 。 こ の 繰 り 返 し は 、 ブ ラ ケ ッ ト 表 現 の リ ス ト に お け る 単 一 の 要 素 と な る 。 上 記 [2] の 、 「 複 数 文 字 か ら な る 照 合 順 序 要 素 」 を 含 む ブ ラ ケ ッ ト 表 現 は 、 し た が っ て 一 文 字 以 上 に マ ッ チ す る こ と が あ る 。 例 え ば 、 も し 照 合 順 序 が "ch" と い う 要 素 を 含 ん で い る 場 合 に は 、 正 規 表 現 "[[.ch.]]*c" は "chchcc" の 最 初 の 5 文 字 に マ ッ チ す る 。 ブ ラ ケ ッ ト 表 現 の 内 部 で は 、 "[=" と "=]" に 囲 ま れ た 照 合 順 序 の 要 素 は 、 等 価 ク ラ ス (equivalence class) と な る 。 こ れ は 、 そ の 要 素 と 等 価 な 要 素 す べ て か ら な る 文 字 シ ー ケ ン ス (自 身 も 含 む ) を 表 す 。 他 に 等 価 な 要 素 が な け れ ば 、 取 り 扱 い は "[." と ".]" で 囲 ま れ て い る 場 合 と 同 じ で あ る 。 例 え ば o と ou が 等 価 ク ラ ス の メ ン バ ー で あ れ ば 、 "[[=o=]]", "[[=^=]]", "[o^]" は す べ て 同 じ 意 味 に な る 。 等 価 ク ラ ス は 領 域 指 定 の 端 点 に は な れ な い (!)。 ブ ラ ケ ッ ト 表 現 の 内 部 で は 、 "[:" と ":]" で 囲 わ れ た 文 字 ク ラ ス (character class) は そ の ク ラ ス に 属 す る す べ て の 文 字 の リ ス ト を 表 す 。 標 準 で 用 意 さ れ て い る 文 字 ク ラ ス の 名 前 は 以 下 の 通 り :
こ れ ら は wctype(3) で 定 義 さ れ て い る 文 字 ク ラ ス を 表 し て い る 。 ロ ケ ー ル (locale) に よ っ て 、 こ れ ら 以 外 の ク ラ ス が 定 義 さ れ る こ と も あ る 。 文 字 ク ラ ス は 領 域 指 定 の 端 点 に は な れ な い 。 正 規 表 現 が 、 与 え ら れ た 文 字 列 の 複 数 の 部 分 文 字 列 (substring) に マ ッ チ で き る よ う な 場 合 に は 、 最 も 先 頭 の 近 く か ら 始 ま る も の に マ ッ チ す る 。 そ の 位 置 か ら 始 ま り 、 正 規 表 現 が マ ッ チ で き る 部 分 文 字 列 が 複 数 あ る 場 合 に は 、 最 長 の も の に マ ッ チ す る 。 部 分 正 規 表 現 (subexpression) も 最 も 長 い 部 分 文 字 列 に マ ッ チ す る 。 た だ し 、 全 体 の マ ッ チ が 最 長 で あ る よ う に 、 と い う 条 件 が 優 先 さ れ る 。 正 規 表 現 の 中 で 先 に 現 れ る 部 分 正 規 表 現 は 、 後 に 現 れ る も の よ り 優 先 さ れ る 。 た だ し 、 よ り 高 位 の 部 分 正 規 表 現 は 、 そ れ を 構 成 す る 低 位 の 部 分 正 規 表 現 よ り も 優 先 さ れ る こ と に 注 意 す る こ と 。 マ ッ チ 長 は 照 合 順 序 の 要 素 で は な く 、 文 字 数 を 単 位 と し て カ ウ ン ト さ れ る 。 null 文 字 列 は 、 全 く マ ッ チ し な か っ た 場 合 よ り も 長 い と み な さ れ る 。 例 え ば "bb*" は "abbbc" の ま ん 中 の 3 文 字 に マ ッ チ す る 。 "(wee|week)(knights|nights)" は "weeknights" の 全 体 に マ ッ チ す る 。 "(.*).*" を "abc" に マ ッ チ さ せ る と 、 括 弧 の 内 部 の 部 分 正 規 表 現 が 3 文 字 す べ て に マ ッ チ す る 。 "(a*)*" を "bc" に マ ッ チ さ せ る と 、 正 規 表 現 全 体 も 、 括 弧 で 括 ら れ た 部 分 正 規 表 現 も null 文 字 列 に マ ッ チ す る 。 マ ッ チ が 大 文 字 ・ 小 文 字 を 無 視 す る よ う に 指 定 さ れ る と 、 ア ル フ ァ ベ ッ ト 全 体 か ら 大 小 文 字 の 区 別 が 無 く な っ た か の よ う な 効 果 と な る 。 大 文 字 ・ 小 文 字 を 持 つ ア ル フ ァ ベ ッ ト が ブ ラ ケ ッ ト 表 現 の 外 部 で 通 常 の 文 字 と し て 現 れ る と 、 こ れ は 実 効 的 に 大 小 両 方 の 文 字 の ブ ラ ケ ッ ト 表 現 の よ う に 変 換 さ れ る 。 す な わ ち 'x' は "[xX]" と な る 。 ブ ラ ケ ッ ト 表 現 の 内 部 に 現 れ る と 、 大 文 字 な ら 小 文 字 が 、 小 文 字 な ら 大 文 字 が そ の ブ ラ ケ ッ ト 表 現 に 加 え ら れ る 。 す な わ ち "[x]" は "[xX]" に 、 "[^x]" は "[^xX]" に な る 。 正 規 表 現 の 長 さ に は 特 に 制 限 は な い (!)。 た だ し 移 植 性 を 高 く し た い プ ロ グ ラ ム で は 、 256 バ イ ト よ り 長 い 正 規 表 現 は 実 行 し な い よ う に す る ほ う が 良 い 。 な ぜ な ら 、 そ の よ う な 正 規 表 現 を 拒 否 し 、 し か も POSIX 互 換 を 保 つ よ う な 実 装 が 可 能 だ か ら で あ る 。 古 い ("基 本 ") 正 規 表 現 は 、 い く つ か の 点 に お い て 異 な る 。 '|', '+', and '?' は 通 常 の 文 字 と な る 。 対 応 す る 機 能 は 存 在 し な い 。 繰 り 返 し 指 定 の 区 切 り は "\{" お よ び "\}" と な る 。 '{' と '}' は 、 単 独 で は 通 常 の 文 字 と し て 扱 わ れ る 。 部 分 正 規 表 現 を ネ ス ト す る 括 弧 は "\(" お よ び "\)" と な り 、 '(' と ')' は 単 独 で は 通 常 の 文 字 と な る 。 '^' は 正 規 表 現 の 先 頭 か 、 括 弧 で く く ら れ た 部 分 表 現 の 先 頭 (!)を 除 い て 通 常 の 文 字 と な る 。 '$' は 正 規 表 現 の 末 尾 か 、 括 弧 で く く ら れ た 部 分 正 規 表 現 の 末 尾 (!)を 除 い て 通 常 の 文 字 と な る 。 '*' は 、 正 規 表 現 の 先 頭 か 、 括 弧 で く く ら れ た 部 分 文 字 列 の 先 頭 に 置 か れ た 場 合 は 通 常 の 文 字 と な る ('^') が 前 置 さ れ て い て も よ い )。 最 後 に 、 ア ト ム と し て 別 の タ イ プ が 存 在 す る 。 後 方 参 照 (back reference) で あ る 。 '\' の 後 に 0 で な い 10 進 数 値 文 字 d が 続 く と 、 括 弧 で く く ら れ た 部 分 正 規 表 現 の d 番 目 に マ ッ チ し た 文 字 並 び と 同 じ も の に マ ッ チ す る 。 (部 分 正 規 表 現 の 番 号 付 け は 、 開 き 括 弧 ’(’ の 位 置 が 左 の も の か ら 右 の も の へ 向 か っ て な さ れ る 。 ) し た が っ て "\([bc]\)\1" は "bb" ま た は "cc" に は マ ッ チ す る が 、 "bc" に は マ ッ チ し な い 。
バ グ
正 規 表 現 が 2 種 類 あ る の は 格 好 悪 い 。 現 在 の POSIX.2 規 格 に お い て は 、 ')' は 、 対 応 す る '(' が な い 場 合 に は 通 常 の 文 字 と し て 扱 わ れ る こ と に な っ て い る 。 し か し こ れ は 、 本 来 の 意 図 と は 異 な る 記 述 上 の エ ラ ー で あ り 、 修 正 さ れ る 可 能 性 が 高 い 。 こ れ に 依 存 し た コ ー ド は 使 わ な い こ と 。 後 方 参 照 は ひ ど く 出 来 の 悪 い 代 物 で あ る 。 効 率 の 良 い 実 装 を す る の は と て も 難 し い 。 ま た 定 義 が あ い ま い で あ る 。 ("a\(\(b\)*\2\)*d" は "abbbd" に マ ッ チ す る と 思 う か ? ) 使 わ な い ほ う が 良 い 。
POSIX.2 の 規 格 で は 、 case (大 文 字 か 小 文 字 か ) に 依 存 し な い マ ッ チ の 記 述 が あ い ま い で あ る 。 現 在 の と こ ろ で は 「 一 つ の case が す べ て の case を 意 味 す る 」 と い う 上 記 の 定 義 が 正 し い 解 釈 で あ る と い う の が 、 実 装 者 の 間 で の 共 通 認 識 の よ う で あ る 。
著 者
こ の ペ ー ジ は Henry Spencer の regex パ ッ ケ ー ジ か ら 採 録 し た も の で あ る 。
関 連 項 目
POSIX.2, section 2.8 (Regular Expression Notation).
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。