正規表現対応とは? わかりやすく解説

正規表現対応

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/09/12 03:39 UTC 版)

Bitapアルゴリズム」の記事における「正規表現対応」の解説

Bitapアルゴリズムは、元のアルゴリズムシフト動作と1のORの直後(shift-orの場合シフト動作直後)にビット移動処理を追加することで正規表現対応させることができる。具体的には、shift-andの場合シフト動作と1のORを行った直後に以下の操作それぞれ必要な回数だけ行なう取捨 acb?aca であれば検索パターンを acXbaca とし、Xのビットが1なら acXbaca の二箇所ビットを1にする。Xのビットは0に戻しておく。 正閉包 acb+aca であれば検索パターンを acbYaca とし、Yのビットが1なら acbYaca の二箇所ビットを1にする。Yのビットは0に戻しておく。 閉包 acb*acaac(b+)?aca等価なので、検索パターンを acXbYaca とし、Xのビットが1なら acXbYaca の二箇所ビットを1にする。Yのビットが1なら acXbYaca の二箇所ビットを1にする。XとYのビットは0に戻しておく。 選言 ac(ba|ab)ca であれば検索パターンを acZbaUabca とし、Zのビットが1なら acZbaUabca の二箇所ビット立てる。またUのビット立っていたら acZbaUabca のビットを1にする。ZとUのビットは0に戻しておく。 上記X, Y, Z, Uは実際文字ではなくビット移動処理を行う場所を示すマーカーである。これらのビット移動処理はNFA言えばεによる状態遷移相当する取捨実装例として、検索対象文字列 acaca からパターン acb?aca検索する場合動作を以下の表に示す。 状態遷移0ビットマスク0正規表現ビットマスクP初期状態acacaa0 1 0 1 1 1 1 0 1 c0 0 1 0 0 0 0 1 0 X0 0 0 1 1 0 0 0 0 b0 0 0 0 1 1 0 0 0 a0 0 0 0 1 1 1 0 1 c0 0 0 0 0 0 0 1 0 a0 0 0 0 0 0 0 0 1 R0R1R2R3' (1)R3' (2)R3' (3)R3R4R5 0 abc1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 XS0000000S00001000 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 上の表では、R2からR3への遷移について説明のために処理フェーズごとに分けて示している。#アルゴリズムの表と比較すると、上記Xの位置を示すビットマスク追加されている。また、S0000000, S0000100は後述するSの値に応じてビットを1にする位置を示すビットマスクである。 Rに対して元のアルゴリズム通りシフトと1のORを行う。その値をXのビットマスクとANDした結果をSとする。R3' (1)はR2に対してシフトと1のORを行った値である。R3' (1)とXのビットマスクのAND結果 (つまりS) は 0000100 になる。 Sのビットが1になっている位置対応したRのビット位置取捨場合取捨対象部分先頭取捨対象部分次の位置)のビットを1にする。Sが0000100だった時にビットを1にする位置ビットマスクS0000100にあらかじめ設定してあるので、RにS0000100をORすればよい。S0000100の1が立っている位置は、パターン acb?aca取捨対象部分先頭 (acXbaca) と取捨対象部分の次 (acXbaca) である。R3' (2)はこの段階まで処理した値である。 X用のビットマスクが1になっている位置のRのビットは0にしておく。X用のビットマスクビット反転 (1111011) してRにANDする。R3' (3)この段階まで処理した値である。 元のアルゴリズム通りマスク処理を行う。R3' (3)にaのビットマスクをANDし、R3得られる同様の処理は他の遷移でも行われているが、上記1.で S = 0000000 の場合、ORされるのはS0000000 (= 0) なので元のアルゴリズムと全く同じ結果になる。(S = 0000000 ならば2.と3.の処理を飛ばしてもよい。)R4からR5への遷移では、Sが0000100なのでR2からR3への遷移同様の処理が行われ、R4で acXbaca で1になっていたビットがR5では acXbaca に移動している。 正閉包選言についても同様な処理で実装できる。 取捨場合、εによる状態遷移行なうフェーズは、これらの正規表現演算子によって追加される一組整数(AND用マスクと、上記実装例でのS0000000, S0000100のようなOR用マスク)を順次処理するだけである。Sは複数の値(Xが一つなら2種類二つなら4種類など)を取りえるため、ビット立て位置を示すビットマスクはSが取りえる全ての値に対応したものをあらかじめ用意しておく。 正閉包でも一組整数(YのAND用マスクとOR用マスク)、選言であれば二組の整数(ZのAND用マスクとOR用マスク、UのAND用マスクとOR用マスク)が考えられるが、これらX, Y, Z, UのAND用マスク全てORして一つのAND用マスクにまとめることができる。そして、そのAND用マスクとRをANDした結果上の例のS)が取りえる全ての値について、対応したOR用マスク用意しておけばよい。 また、任意の1文字基本正規表現での ".")への対応は、全ての文字マスク上記例でのa, b, c用マスク)の該当位置ビットを1にしておくだけで容易に実現できる同様にその他の文字クラス([ab], \s など)に対応する場合も、該当する文字マスク該当位置ビットを1にしておけばよい。

※この「正規表現対応」の解説は、「Bitapアルゴリズム」の解説の一部です。
「正規表現対応」を含む「Bitapアルゴリズム」の記事については、「Bitapアルゴリズム」の概要を参照ください。

ウィキペディア小見出し辞書の「正規表現対応」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「正規表現対応」の関連用語

正規表現対応のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



正規表現対応のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのBitapアルゴリズム (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS