トップ :: G 物理学 :: G06 計算;計数

【発明の名称】 文字列照合方法、これを用いた文書処理装置及びプログラム
【発明者】 【氏名】長谷川 勇
【住所又は居所】神奈川県大和市下鶴間1623番地14 日本アイ・ビー・エム株式会社 大和事業所内
【課題】部分正規表現や最長一致を含むPOSIX正規表現、また複数文字照合要素を含む正規表現を、決定性有限状態オートマトンにて処理できるようにする。

【解決手段】文字列の正規表現から非決定性有限状態オートマトンを構築し、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築するオートマトン構築部210と、この決定性有限状態オートマトンを用いて文字列のマッチングを行うオートマトン判定部240とを備える。そして、このオートマトン判定部240は、マッチした文字列に関し、さらに非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、文字列のマッチ範囲を特定する。また、このオートマトン判定部240は、処理対象である文字列の各要素に対して、決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行う。
【特許請求の範囲】
【請求項1】 コンピュータを用いて文字列の照合を行う文字列照合方法において、文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納するステップと、前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納するステップと、前記メモリから前記決定性有限状態オートマトンを読み出し、当該決定性有限状態オートマトンを用いて文字列のマッチングを行うステップと、マッチした前記文字列に関し、前記メモリから読み出した前記非決定性有限状態オートマトンと前記決定性有限状態オートマトンとを用いて、当該文字列のマッチ範囲を特定するステップとを含むことを特徴とする文字列照合方法。
【請求項2】 前記非決定性有限状態オートマトンを作成するステップは、文字列の正規表現に対し、当該正規表現中の一定の範囲を指定する要素を除く各要素に1つずつ対応させた非決定性有限状態オートマトンの状態を生成するステップと、繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた前記状態への遷移を対応させるステップとを含むことを特徴とする請求項1に記載の文字列照合方法。
【請求項3】 前記マッチ範囲を特定するステップは、前記決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除するステップと、残った前記状態列に基づいて前記文字列のマッチ範囲を特定するステップとを含むことを特徴とする請求項1に記載の文字列照合方法。
【請求項4】 前記マッチ範囲を特定するステップは、前記決定性有限状態オートマトンによる状態遷移を示す状態列のうち、最長最左規則を満足する状態列に基づいて前記文字列のマッチ範囲を特定するステップを含むことを特徴とする請求項1に記載の文字列照合方法。
【請求項5】 コンピュータを用いて文字列の照合を行う文字列照合方法において、所定の文字列の正規表現に基づいて作成された決定性有限状態オートマトンをメモリから読み込み、当該決定性有限状態オートマトンを用いて文字列のマッチングを行い、処理結果をメモリに格納する第1のステップと、前記決定性有限状態オートマトンによる状態遷移を示す状態列を、終了状態へ到達可能な状態列に絞り込む第2のステップと、絞り込まれた前記状態列に基づいて、処理対象である文字列中のどの文字が前記正規表現のどの部分にマッチしたかを特定する第3のステップとを含むことを特徴とする文字列照合方法。
【請求項6】 前記第3のステップは、絞り込まれた前記状態列のうち、先に出現する繰り返しが最も多くなる状態列を選択し、当該状態列に基づいて前記処理対象である文字列中の各文字と前記正規表現のどの部分にマッチしたかを判断するステップを含むことを特徴とする請求項5に記載の文字列照合方法。
【請求項7】 コンピュータを用いて文字列の照合を行う文字列照合方法において、所定の文字列の正規表現に基づいて作成された決定性有限状態オートマトンをメモリから読み込み、当該決定性有限状態オートマトンを用いて文字列のマッチングを行い、処理結果をメモリに格納する第1のステップと、前記決定性有限状態オートマトンによる状態遷移を示す第1の状態列に基づいて、前記非決定性有限状態オートマトンにおける状態遷移を示す第2の状態列を復元する第2のステップと、復元された前記第2の状態列に基づいて、前記文字列中のどの文字が前記正規表現のどの部分にマッチしたかに関する情報を取得する第3のステップとを含むことを特徴とする文字列照合方法。
【請求項8】 前記第2のステップは、前記第2の状態列として、最長最左規則を満足する状態列を復元するステップを含むことを特徴とする請求項7に記載の文字列照合方法。
【請求項9】 コンピュータを用いて文字列の照合を行う文字列照合方法において、文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納するステップと、前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納するステップと、処理対象である文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行うステップとを含むことを特徴とする文字列照合方法。
【請求項10】 前記マッチングを行うステップは、処理対象である前記文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定するステップと、前記文字列に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列が複数文字照合要素である場合における状態遷移を反映させて前記遷移先の状態を動的に決定するステップとを含むことを特徴とする請求項9に記載の文字列照合方法。
【請求項11】 前記マッチングを行った後、マッチした前記文字列に関し、前記メモリから読み出した前記非決定性有限状態オートマトンと前記決定性有限状態オートマトンとを用いて、当該文字列のマッチ範囲に関する情報を得るステップをさらに含むことを特徴とする請求項9に記載の文字列照合方法。
【請求項12】 コンピュータを用いて文字列の照合を行う文字列照合方法において、文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納するステップと、前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納するステップと、処理対象である文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移を生成すると共に、当該複数文字照合要素に該当し得る文字列に対応する状態遷移を仮想的に生成し、当該状態遷移に基づいてマッチングを行うステップとを含むことを特徴とする文字列照合方法。
【請求項13】 正規表現を用いて文字列の検索を行う文書処理装置において、文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、前記非決定性有限状態オートマトン構築手段にて構築された前記非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、前記決定性有限状態オートマトン構築手段にて構築された前記決定性有限状態オートマトンを用いて文字列のマッチングを行う判定手段とを備え、前記判定手段は、マッチした前記文字列に関し、さらに前記非決定性有限状態オートマトンと前記決定性有限状態オートマトンとを用いて、当該文字列のマッチ範囲を特定することを特徴とする文書処理装置。
【請求項14】 前記非決定性有限状態オートマトン構築手段は、文字列の正規表現に対し、当該正規表現中の一定の範囲を指定する要素を除く各要素に1つずつ対応させた非決定性有限状態オートマトンの状態を生成し、かつ繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた前記状態への遷移を対応させることを特徴とする請求項13に記載の文書処理装置。
【請求項15】 前記判定手段は、前記決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除して絞り込む状態列絞り込み手段と、前記状態列絞り込み手段により絞り込まれた状態列に基づいて前記文字列のマッチ範囲を特定するマッチ範囲判定手段とを備えることを特徴等する請求項13に記載の文書処理装置。
【請求項16】 正規表現を用いて文字列の検索を行う文書処理装置において、文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、前記非決定性有限状態オートマトン構築手段にて構築された前記非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、前記決定性有限状態オートマトン構築手段にて構築された前記決定性有限状態オートマトンを用い、処理対象である文字列の各要素に対して、前記決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行う判定手段とを備えることを特徴とする文書処理装置。
【請求項17】 前記判定手段は、処理対象である前記文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定し、複数文字照合要素に該当し得る文字列が含まれていると判断した場合に、当該文字列が複数文字照合要素である場合における状態遷移を反映させて前記遷移先の状態を動的に決定することを特徴とする請求項16に記載の文書処理装置。
【請求項18】 前記判定手段は、前記決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除して絞り込む状態列絞り込み手段と、前記状態列絞り込み手段により絞り込まれた状態列に基づいて前記文字列のマッチ範囲を特定するマッチ範囲判定手段とを備えることを特徴とする請求項16に記載の文書処理装置。
【請求項19】 コンピュータを制御して、文字列の照合を行うプログラムであって、文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納する処理と、前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納する処理と、前記メモリから前記決定性有限状態オートマトンを読み出し、当該決定性有限状態オートマトンを用いて文字列のマッチングを行う処理と、マッチした前記文字列に関し、前記メモリから読み出した前記非決定性有限状態オートマトンと前記決定性有限状態オートマトンとを用いて、当該文字列のマッチ範囲を特定する処理とを前記コンピュータに実行させることを特徴とするプログラム。
【請求項20】 前記非決定性有限状態オートマトンを作成する処理は、文字列の正規表現に対し、当該正規表現中の一定の範囲を指定する要素を除く各要素に1つずつ対応させた非決定性有限状態オートマトンの状態を生成する処理と、繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた前記状態への遷移を対応させる処理とを含むことを特徴とする請求項19に記載のプログラム。
【請求項21】 前記マッチ範囲を特定する処理は、前記決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除する処理と、残った前記状態列に基づいて前記文字列のマッチ範囲を特定する処理とを含むことを特徴とする請求項19に記載のプログラム。
【請求項22】 コンピュータを制御して、文字列の照合を行うプログラムであって、文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納する処理と、前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納する処理と、処理対象である文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行う処理とを前記コンピュータに実行させることを特徴とするプログラム。
【請求項23】 前記マッチングの処理は、処理対象である前記文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定する処理と、前記文字列に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列が複数文字照合要素である場合における状態遷移を反映させて前記遷移先の状態を動的に決定する処理とを含むことを特徴とする請求項22に記載のプログラム。
【発明の詳細な説明】【0001】
【発明の属する技術分野】本発明は、有限状態オートマトンを用いてパターンマッチング(文字列の照合)を行う技術に関し、特に文字列の正規表現を用いたパターンマッチングを決定性有限状態オートマトンにて実行するための技術に関する。
【0002】
【従来の技術】コンピュータを用いたテキスト処理ツールでは、文字列検索などに用いられるパターンマッチング、すなわち文字列中のパターンを発見し操作するための機構として正規表現が広く利用されている。例えば、正規表現“(ab)*”は“ab”の0回以上の繰り返し(“”、“ab”、“abab”、...)にマッチし、“[acd]”は“a”、“c”または“d”にマッチする。また、“.”は任意の1文字にマッチし、“ab|cd”は“ab”または“cd”のいずれかにマッチする。
【0003】文字列検索などの処理を行う場合には、この正規表現から、正規表現によるパターンマッチングの評価器である有限状態オートマトン(Finite State Automaton)を作成し、検索の対象である文字列に関してこの有限状態オートマトンを処理する。ここで、有限状態オートマトンには、非決定性有限状態オートマトン(Non deterministic Finite state Automaton:NFA)と、決定性有限状態オートマトン(Deterministic Finite state Automaton:DFA)とがあり、DFAはNFAから作成することができる。
【0004】図34は、正規表現“([ab]c)*ac”にマッチングするNFAの例である。また、図35は、図34のNFAと等価のDFAである。これらの有限状態オートマトンは、例えば入力が“acac”や“ac”である場合は正規表現“([ab]c)*ac”にマッチするので受理する。また、入力が“aa”である場合は正規表現“([ab]c)*ac”にマッチしないので受理しない。なお、一般に所定の正規表現に対応するNFAは複数存在するが、DFAは一意に決まる。実際の処理では、処理速度に優れるDFAを用いることが好ましい。したがって、例えば文字列検索の場合、検索条件を正規表現で記述し、この正規表現からNFAを作成し、さらにこのNFAからDFAを作成し、このDFAを処理することにより検索処理を行う。正規表現および有限状態オートマトンを用いたパターンマッチングに関しては、例えば下記の文献に詳細に記載されている。
文献:V.J.Rayward-Smith.言語理論入門.共立出版, 1986.井上謙蔵監訳.【0005】
【発明が解決しようとする課題】ところで、UNIX(登録商標)システムでは、オペレーティングシステム間の互換性を確保するため、標準的なAPI(Application Program Interface)であるPOSIX(Portable Operating System Interface for UNIX)が、IEEEによって定められている。このPOSIXに準拠する正規表現(以下、POSIX正規表現)は、部分正規表現や最長一致など、本来の正規表現の範疇を越えた機能を持つ。そのため、文字列検索などに用いるパターンマッチング機能をDFAで実装するには困難な場合があった。POSIXでは、与えられた文字列中の最も左にある部分文字列にマッチし、さらに各正規表現の要素は可能な限り長い(最長の)文字列にマッチするという最長最左規則が存在する。このため、例えば、POSIX正規表現による“([ab]c)*ac”に、入力“acac”を与えると、“([ab]c)*”が最長一致し、部分正規表現“([ab]c)”がマッチした部分(入力の先頭“ac”)に関する情報を取得できる。これらの情報はPOSIXに準拠した関数を用いる場合などに必要となる場合がある。しかし、これらの情報はNFAからDFAへ変換した際に失われ、正規表現のどの要素がどの文字にマッチしたかが識別できなくなっているため、DFAで処理することができず、処理速度の遅いNFAを用いてパターンマッチングを行わなければならなかった。
【0006】また、テキスト処理ツールには、正規表現“[a-b]”で、要素‘a’、‘b’、‘aa’にマッチするというように、可変長の照合要素(以下、複数文字照合要素)を扱うことが可能なものがある。図36は、複数文字照合要素を含む正規表現に対応するNFAの例を示す図である。この場合、図36において最初の状態0から状態1に遷移する場合と状態2に遷移する場合とでは、受理する文字の長さが違ってしまうため、そのままではDFAを構築してパターンマッチングを行うことができない。これに対し、複数文字照合要素の可能な文字列(上記の正規表現“[a-b]”では要素‘a’、‘b’、‘aa’のそれぞれ)を列挙して個別に状態を遷移させるDFAを構築して対応することが考えられる。しかしながら、複数文字照合要素がマッチする文字列全てを列挙するAPI(Application Program Interface)がPOSIXで提供されていないため、そのようなDFAを構築することはできない。したがって、このような場合には処理速度の遅いNFAを用いてパターンマッチングを行わなければならなかった。
【0007】そこで本発明は、部分正規表現や最長一致を含むPOSIX正規表現をDFA(決定性有限状態オートマトン)にて処理できるようにすること、またそのような処理装置(コンピュータ装置)を実現することを目的とする。また、複数文字照合要素を含む正規表現をDFA(決定性有限状態オートマトン)にて処理できるようにすること、またそのような処理装置(コンピュータ装置)を実現することを他の目的とする。
【0008】
【課題を解決するための手段】上記の目的を達成するため、本発明は、コンピュータを用いて文字列の照合を行う文字列照合方法として実現される。すなわち、この文字列照合方法は、文字列の正規表現から非決定性有限状態オートマトンを作成するステップと、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成するステップと、この決定性有限状態オートマトンを用いて文字列のマッチングを行うステップと、マッチした前記文字列に関し、これらの非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、この文字列のマッチ範囲を特定するステップとを含むことを特徴とする。
【0009】ここで、この非決定性有限状態オートマトンを作成するステップは、詳しくは、文字列の正規表現に対し、この正規表現中の一定の範囲を指定する要素を除く各要素に1つずつ対応させた非決定性有限状態オートマトンの状態を生成するステップと、繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた状態への遷移を対応させるステップとを含む。また、マッチ範囲を特定するステップは、詳しくは、決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除するステップと、残った前記状態列に基づいて文字列のマッチ範囲を特定するステップとを含む。さらに、より好ましくは、このマッチ範囲を特定するステップは、決定性有限状態オートマトンによる状態遷移を示す状態列のうち、最長最左規則を満足する状態列に基づいて文字列のマッチ範囲を特定するステップを含む。
【0010】また、本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、所定の文字列の正規表現に基づいて作成された決定性有限状態オートマトンをメモリから読み込み、この決定性有限状態オートマトンを用いて文字列のマッチングを行い、処理結果をメモリに格納する第1のステップと、この決定性有限状態オートマトンによる状態遷移を示す状態列を、終了状態へ到達可能な状態列に絞り込む第2のステップと、絞り込まれた状態列に基づいて、処理対象である文字列中のどの文字が正規表現のどの部分にマッチしたかを特定する第3のステップとを含むことを特徴とする。ここで、この第3のステップは、より好ましくは、絞り込まれた状態列のうち、先に出現する繰り返しが最も多くなる状態列を選択し、この状態列に基づいて処理対象である文字列中の各文字と正規表現のどの部分にマッチしたかを判断するステップを含む。
【0011】さらに本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、所定の文字列の正規表現に基づいて作成された決定性有限状態オートマトンをメモリから読み込み、この決定性有限状態オートマトンを用いて文字列のマッチングを行い、処理結果をメモリに格納する第1のステップと、この決定性有限状態オートマトンによる状態遷移を示す第1の状態列に基づいて、非決定性有限状態オートマトンにおける状態遷移を示す第2の状態列を復元する第2のステップと、復元された第2の状態列に基づいて、文字列中のどの文字が正規表現のどの部分にマッチしたかに関する情報を取得する第3のステップとを含むことを特徴とする。ここで、この第2のステップは、より好ましくは、第2の状態列として、最長最左規則を満足する状態列を復元するステップを含む。
【0012】さらにまた、本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、文字列の正規表現から非決定性有限状態オートマトンを作成するステップと、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成するステップと、処理対象である文字列の各要素に対して、この決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行うステップとを含むことを特徴とする。
【0013】ここで、さらに詳しくは、このマッチングを行うステップは、処理対象である文字列を先読みしてこの文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定するステップと、この文字列に複数文字照合要素に該当し得る文字列が含まれている場合に、この文字列が複数文字照合要素である場合における状態遷移を反映させて遷移先の状態を動的に決定するステップとを含む。また、より好ましくは、この文字列照合方法は、マッチングを行った後、マッチした文字列に関し、非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、この文字列のマッチ範囲に関する情報を得るステップをさらに含む構成とする。
【0014】さらに、本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、文字列の正規表現から非決定性有限状態オートマトンを作成するステップと、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成するステップと、処理対象である文字列を先読みしてこの文字列中に複数文字照合要素に該当し得る文字列が含まれている場合に、文字列の各要素に対して、決定性有限状態オートマトンの状態遷移を生成すると共に、この複数文字照合要素に該当し得る文字列に対応する状態遷移を仮想的に生成し、これらの状態遷移に基づいてマッチングを行うステップとを含むことを特徴とする。
【0015】また、上記の目的を達成する他の本発明は、正規表現を用いて文字列の検索を行う文書処理装置において、文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、この非決定性有限状態オートマトン構築手段にて構築された非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、この決定性有限状態オートマトン構築手段にて構築された決定性有限状態オートマトンを用いて文字列のマッチングを行う判定手段とを備える。この判定手段は、マッチした文字列に関し、さらに非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、文字列のマッチ範囲を特定することを特徴とする。
【0016】ここで、この非決定性有限状態オートマトン構築手段は、文字列の正規表現に対し、この正規表現中の一定の範囲を指定する要素を除く各要素に1つずつ対応させた非決定性有限状態オートマトンの状態を生成し、かつ繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた状態への遷移を対応させることを特徴とする。また好ましくは、この判定手段は、決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除して絞り込む状態列絞り込み手段と、この状態列絞り込み手段により絞り込まれた状態列に基づいて文字列のマッチ範囲を特定するマッチ範囲判定手段とする。
【0017】また、本発明は、次のような他の文書処理装置としても実現される。すなわち、正規表現を用いて文字列の検索を行う文書処理装置において、文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、この非決定性有限状態オートマトン構築手段にて構築された非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、この決定性有限状態オートマトン構築手段にて構築された決定性有限状態オートマトンを用い、処理対象である文字列の各要素に対して、決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行う判定手段とを備えることを特徴とする。
【0018】ここで、さらに好ましくは、この判定手段は、処理対象である文字列を先読みして文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定し、複数文字照合要素に該当し得る文字列が含まれていると判断した場合に、この文字列が複数文字照合要素である場合における状態遷移を反映させて遷移先の状態を動的に決定する。また、この判定手段は、決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除して絞り込む状態列絞り込み手段と、この状態列絞り込み手段により絞り込まれた状態列に基づいて文字列のマッチ範囲を特定するマッチ範囲判定手段とを備える構成とすることができる。
【0019】さらに本発明は、コンピュータを制御して上述した文字列照合方法を実行するプログラムとして、あるいはコンピュータを上記の文書処理装置として機能させるプログラムとして実現することができる。かかるプログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより、提供することができる。
【0020】
【発明の実施の形態】以下、添付図面に示す第1、第2の実施の形態に基づいて、この発明を詳細に説明する。なお、以下の実施の形態の説明において、正規表現は、POSIX正規表現(POSIXに準拠した正規表現)を意味する。
[第1の実施の形態]第1の実施の形態では、正規表現で表現された検索条件に基づき、DFA(決定性有限状態オートマトン)を用いて文字列検索を行う文書処理システムをコンピュータにて実現する。このシステムは、DFAを作成した際にDFAが遷移した状態を記録しておく。そして、記録された状態の列から、対応するNFA(非決定性有限状態オートマトン)を用いた場合にたどる状態の列を得ることで、DFAへの変換で失われた必要な情報を取得する。これにより、正規表現で用いられる部分正規表現や最長一致に対しても、DFAによる高速なパターンマッチングを行うことが可能となる。
【0021】図1は、第1の実施の形態による文書処理システムを実現するのに好適なコンピュータ装置のハードウェア構成の例を模式的に示した図である。図1に示すコンピュータ装置は、演算手段であるCPU(Central ProcessingUnit:中央処理装置)101と、M/B(マザーボード)チップセット102及びCPUバスを介してCPU101に接続されたメインメモリ103と、同じくM/Bチップセット102及びAGP(Accelerated Graphics Port)を介してCPU101に接続されたビデオカード104と、PCI(Peripheral Component Interconnect)バスを介してM/Bチップセット102に接続されたハードディスク105及びネットワークインターフェイス106と、さらにこのPCIバスからブリッジ回路107及びISA(Industry Standard Architecture)バスなどの低速なバスを介してM/Bチップセット102に接続されたフロッピー(登録商標)ディスクドライブ108及びキーボード/マウス109とを備える。また、図1には記載していないが、このコンピュータ装置は、後述するようにCPU101の動作性能(動作クロック)を制御する手段として、クロック発信器及びそのコントローラを備える。なお、図1は本実施の形態を実現するコンピュータ装置のハードウェア構成を例示するに過ぎず、本実施の形態を適用可能であれば、他の種々の構成を取ることができる。例えば、ビデオカード104を設ける代わりに、ビデオメモリのみを搭載し、CPU101にてイメージデータを処理する構成としても良いし、音声による入出力を行うためのサウンド機構を設けたり、ATA(AT Attachment)などのインターフェイスを介してCD−ROM(Compact Disc Read Only Memory)やDVD−ROM(Digital Versatile Disc Read Only Memory)のドライブを設けたりしても良い。
【0022】図2は、第1の実施の形態による文書処理システムの構成を説明するブロック図である。図2を参照すると、本実施の形態の文書処理システム200は、文字列のパターンマッチングを行うDFAを作成するオートマトン構築部210と、作成されたDFAを保持するオートマトン保持部220と、検索対象である文書データを保持する文書保持部230と、DFAを用いて文字列検索におけるパターンマッチングを実行するオートマトン判定部240とを備える。また、本実施の形態による文字列検索以外の処理を実行するための文書処理部250と、コンピュータ装置にてこれらの機能を実現する処理プログラムを保持する処理プログラム保持部260とを備える。また図示のように、文書処理システム200は、ユーザ(文書利用者)が検索キーあるいは検索対象である文書データや各種の処理を行うためのコマンドを入力すると共に、処理結果を出力するための入出力装置300に接続されている。
【0023】図2において、オートマトン保持部220、文書保持部230及び処理プログラム保持部260は、メインメモリ103にて実現される。なお、メインメモリ103に保持されるデータは、必要に応じてハードディスク105などの記憶装置に退避させることができる。また、オートマトン構築部210、オートマトン判定部240及び文書処理部250は、処理プログラム保持部260に格納された処理プログラムにより制御されたCPU101にて実現されるソフトウェアブロックである。CPU101を制御してこれらの機能を実現する処理プログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより提供される。
【0024】図3は、オートマトン構築部210によるDFA構築処理の概略的な流れを示すフローチャートである。図3に示すように、オートマトン構築部210は、検索キーとなる文字列の正規表現の入力を受理すると(ステップ301)、まず、当該正規表現から構文木を構築する(ステップ302)。構築された構文木は、メインメモリ103やCPU101の図示しないキャッシュメモリに格納される。次に、オートマトン構築部210は、メインメモリ103等から構文木を読み出し、当該構文木に基づいてNFAを構築する(ステップ303)。構築されたNFAは、メインメモリ103やCPU101の図示しないキャッシュメモリに格納される。さらにオートマトン構築部210は、メインメモリ103等からNFAを読み出し、当該NFAに基づいてDFAを構築する(ステップ304)。構築されたDFAは、メインメモリ103やCPU101の図示しないキャッシュメモリに格納される。すなわちオートマトン構築部210は、本実施の形態で用いるDFAを作成するため、構文木構築手段、NFA構築手段およびDFA構築手段として機能する。なお、構築されたNFAおよびDFAは、メインメモリ103にて実現されたオートマトン保持部220に格納される。
【0025】ステップ301で正規表現から構築される構文木(二分木)は、後述する適切なNFAを作成するための情報を含んでいればどのような構成であっても良いが、例えば、ノードが次に示す4つのうちのいずれかであるような構文木とすることができる。
1.正規表現中の一定の範囲(部分正規表現)を指定する要素‘(’、‘)’を除く演算子(1つの演算子は正規表現の1要素に対応する)
このノードでは、‘[abc]’は1つの演算子とみなし、対応するノードも1つである。また、‘*’は子を1つ持つ(“<re>*”の<re>に対応する部分木。なお部分木は、構文木中のあるノード及びその子孫(子、孫、・・・)の全てを含む木であり、正規表現の一部分に対応する)。さらに、‘|(<ALT>)’は子を2つ持つ(“<re1>|<re2>”の<re1>、<re2>に対応する部分木)。その他の演算子(“a”、“[a-c]”など)は子を持たない。
2.<TERM> 正規表現の末尾を示す仮想的な演算子(正規表現“abc”の場合、‘c’の後ろに仮想的な終端の文字があると考え、これを<TERM>とする)
このノードは子を持たない。
3.<CONCAT> 正規表現の連結を表す仮想的なノード(対応するNFA状態および演算子はない)
例えば、正規表現“abc”は、要素‘a’と‘b’との連結、及び当該連結と要素‘c’との連結であり、この「連結」を1つのノードとする。また、このノードは子を2つ持つ(連結する2つの部分正規表現に対応する部分木)。
4.<SUBEXP> 括弧で囲われた部分正規表現を表す(対応するNFA状態はない。正規表現中の‘(’、‘)’の組に対応)
このノードは子を1つ持つ(‘(’、‘)’の内の部分正規表現に対応する部分木)。
【0026】図4は、正規表現“ab|c(de)*”から構築される構文木を示す図である。図4において、正規表現“[ab]|c(de)*”に対し、“[ab]”、“|”、“c”、“d”、“e”、“*”がそれぞれ演算子であり、対応するノードが生成されている。また、ノード<C> はCONCAT、ノード | はALT、ノード<S> はSUBEXP、ノード<T> はTERMである。この構文木を構築する処理は公知の技術を用いることができる。図5は、構文木を構築する処理を実行するためのプログラムの例である。
【0027】ステップ302で構文木から構築されるNFAは、本実施の形態に用いるための条件を具備する。すなわち、DFAの状態列から復元可能であること、正規表現の最長最左規則に従うことである。上述したように、所定の正規表現からは複数のNFAを作成し得る。しかしながら、本実施の形態では、DFAによるパターンマッチングにおいて、NFAを用いた場合にたどる状態の列の情報を利用するため、この目的に適した、すなわち上記の条件を具備したNFAを構築することが必要である(以下、このNFAを適切なNFAと称す)。この適切なNFAは、次の特徴を持つ。
1.“(”、“)”を除く全ての要素(“a”、“[a-c]”、“*”など)にNFAの状態を1つ対応させる。
2.ε遷移(文字を受理せずに行う遷移)を、繰り返し(*、+、?など)と選択(|)にのみ許す。
3.(ε遷移を除いて)遷移先はただ1つ。
【0028】かかる適切なNFAを作成するため、本実施の形態では、first、epsdest、nextという3種類の関数を定義する。以下、各関数について説明する。first:構文木中の所定の部分木(=引数のノードを根とする部分木)が対応する部分正規表現において、最初に「出現」する演算子に対応するNFA状態を返す。ここで、最初に「出現」する演算子とは、最初に処理しなければならない演算子であることを意味する。また、NFA状態は、NFAにおける1つの丸(ノード)で示される。本実施の形態では、NFA状態は演算子に対応し、全てのNFA状態は対応するノードを1つ持つ(逆は真ではなく、対応するNFA状態を持たないノードも存在する)。なお、従来技術においてNFA/DFAを構築するために定義される関数firstでは演算子の集合が返されるのに対し、本実施の形態では演算子1つ(=NFA状態1つ)のみが返される。以上の定義から、次のことが成り立つ。
first(<char>)=<char> (文字)
first(<re1><re2>)=first(<re1>) (連結)
first(<re1>|<re2>)= | (選択)
first(<re1>*)= * (繰り返し)
first((<re>))=first(<re>) (括弧で囲われた部分正規表現)
図6は、関数firstの定義コードを例示する図である。
【0029】epsdest:引数のノードに対応するNFA状態からε遷移可能なNFA状態の集合を返す。ここで、epsdestが空でない集合を返す、すなわちε遷移を許すのは、“繰り返しの演算子”と“選択の演算子”のみである。この定義から、次のことが成り立つ。
epsdest(*)=first(<re>)∪next(<re>)(ただし、* の周りを“<re>*”とする)
epsdest(|)=first(<re1>)∪first(<re2>)(ただし、| の周りを“<re1>|<re2>”とする)
epsdest(<op>)=φ(ただし、<op> は、*、| 以外の演算子“a”、“[ab]”など)
図7は、関数epsdestの定義コードを例示する図である。
【0030】next:引数のノードを根とする部分木が対応する部分正規表現の次に出現する演算子に対応するNFA状態を返す。すなわち、関数nextは、引数のノードが対応するNFA状態の遷移先を示す。また、関数firstと同様に、返す値が演算子の集合ではなく演算子1つのみであるため、“*”及び“|”を除く各NFA状態の遷移先は一意に定まる。このとき受理する文字は、当該ノードが対応する演算子がマッチする文字である。以上の定義から、次のことが成り立つ。なお、next(<re1>)は、正規表現中の<re1>の周囲に応じて定義される。
<re1>の周囲が<re1><re2>であるとき、 next(<re1>)=first(<re2>) (連結)
<re1>の周囲が<re1>|<re2>であるとき、 next(<re1>)=next(<re1>|<re2>) (選択)
<re1>の周囲が<re1>*であるとき、 next(<re1>)= * (繰り返し)
<re1>の周囲が(<re1>)であるとき、 next(<re1>)=next((<re1>)) (括弧で囲われた部分正規表現)
<re1>が正規表現全体を表す、すなわち<re1>の周囲が<re1>であるとき、 next(<re1>)=<TERM> (一番外側の正規表現)
図8は、関数nextの定義コードを例示する図である。
【0031】図9は、上述した関数を用いて適切なNFAを構築する処理を説明するフローチャートである。なお、以下の動作において、NFAの開始状態とは、構文木のfirst(=正規表現で最初に処理すべき演算子)である。また、NFAの状態には、正規表現の‘(’、‘)’を除く演算子と<TERM>にNFAの状態が1つずつ割り当てられる。また、所定のNFA状態のε遷移先は、そのNFA状態に対応するノードのepsdest(定義より)である。ここで、epsdestが空でないのは、‘*’または‘|’の場合のみであり、ε遷移可能な状態も‘*’及び‘|’のみである。さらにまた、所定のあるNFA状態の遷移先は、そのNFA状態がε遷移先を持つ場合は、通常の遷移先はない。これに対しε遷移先を持たない場合は、そのNFA状態に対応するノードのnextである。このとき、受理する文字は、そのNFA状態が対応する演算子がマッチする文字である。例えば、演算子“a”は、文字“a”にマッチし、演算子“[abc]”は、文字“a”、“b”、“c”のいずれかにマッチする。また、NFAの終了状態とは、<TERM>である(<TERM>を除く全てのNFA状態は「ε遷移先を2つ」または「通常の遷移先を1つ」持つ)。
【0032】図9を参照すると、オートマトン構築部210は、まず〔nfa_st_num〕個のNFA状態を生成する(ステップ901)。ここで、nfa_st_numは、正規表現から本手法で生成するNFA状態の個数であり、正規表現中の‘(’、‘)’を除く要素の個数+1(<TERM>の分)である。次に、NFAの開始状態(nfa_init)を構文木の最初のノード(first(tree))、すなわち正規表現で最初に処理すべき演算子とする。また、NFAの停止状態(nfa_halt)をNFAの状態数(nfa_st_num−1)とする(ステップ902)。
【0033】次に、変数iを初期化(i=0)して、i番目のNFA状態(状態i)に対応する構文木上のノードへの参照(state_trees[i])を調べる(ステップ903、904)。このノードへの参照である演算子が‘*’または‘|’である場合は、関数epsdestで得られるepsdest(state_trees[i])を状態iのε遷移先とする(ステップ905)。一方、状態iに対応する構文木上のノードへの参照である演算子が‘*’及び‘|’以外のものである場合は、当該ノードへの参照(state_trees[i])が表す当該要素に対する状態iの遷移先を、関数nextで得られるnext(state_trees[i])とする(ステップ906)。
【0034】この後、変数iの値を1加算し(ステップ907)、得られた新たな変数iがNFAの状態数に達したか否かを調べる(ステップ908)。そして、当該新たな変数iの値がNFAの状態数未満であれば、当該新たな変数iを用いてステップ904移行の処理を実行する。一方、当該新たな変数iの値がNFAの状態数に達したならば、NFAの停止状態に達し、適切なNFAが作成されたので、処理を終了する。作成された適切なNFAは、後でオートマトン判定部240による処理に用いられるため、オートマトン保持部220に格納される。
【0035】ステップ303で適切なNFAからDFAを構築する処理は、公知の手法を用いることができる。すなわち、元のNFAの各状態で1文字受け取った際にどのように状態が遷移するかという情報を集めて1個の新しい状態を作る作業を、開始状態から最終状態まで順に繰り返す処理である。以上のようにして作成されたDFAは、メインメモリ103等で実現されるオートマトン保持部220に格納され、オートマトン判定部240による処理に使用される。
【0036】図10は、オートマトン判定部240によるパターンマッチング処理の概略的な流れを示すフローチャートである。図10に示すように、オートマトン判定部240は、オートマトン保持部220に格納されているDFAと、文書保持部230に格納されている検索対象の文字列(文書データ)とを読み出して入力すると(ステップ1001)、まず、DFAにより入力文字列の判定(マッチング)を行う(ステップ1002)。判定結果は、メインメモリ103やCPU101の図示しないキャッシュメモリに格納される。次に、オートマトン判定部240は、当該入力文字列が受理されたならば、オートマトン保持部220から読み出されたNFA及びDFAを用いて、DFA状態列の絞り込み処理およびマッチ範囲(正規表現の所定の部分(部分正規表現)にマッチしている文字列の部分(部分文字列)の範囲)の判定処理を行う(ステップ1003〜1005)。この処理結果は、メインメモリ103やCPU101の図示しないキャッシュメモリに格納される。最後に、オートマトン判定部240は、ステップ1002の判定結果及びステップ1004、1005の処理結果をメインメモリ103等から読み出し、ディスプレイ装置等の出力デバイスを介して出力する(ステップ1006)。また、当該入力文字列がDFAにより受理されなかったならば、不受理の結果を出力する(ステップ1003、1006)。以上の処理を全ての入力文字列に対して実行する(ステップ1007)。すなわち、オートマトン判定部240は、入力文字列判定手段、DFA状態列絞り込み手段およびマッチ範囲判定手段として機能する。
【0037】ステップ1002における文字列のマッチング処理は、公知の手法を用いることができる。ここで、入力文字列がDFAにマッチし、受理された場合であっても、それだけでは当該入力文字列中の部分正規表現がマッチした部分に関する情報を得られない。すなわち、DFAの状態列には入力に対してたどり得る全てのNFAの状態列が含まれているため、正規表現のどの要素がどの文字にマッチしたかが識別できず、POSIXにおける最長最左規則に適合する状態遷移がわからない。そこで、本実施の形態のオートマトン判定部240は、DFAの絞り込みで最長のNFA状態列の候補を取得し、最左なNFA状態列を復元することによりマッチ範囲を判定することにより、かかる情報を取得する。
【0038】ステップ1004におけるDFA状態列の絞り込みでは、入力に対して到達し得る全てのNFAの状態が含まれているDFA状態列のうちから、終了状態に到達し得ない不要なNFAの状態列を削除する。このDFA状態列の絞り込みは、DFAを構成したNFA(適切なNFA)に基づいてDFAの状態列を後ろからたどることによって行う。図11は、DFA状態列の絞り込みにおける動作を説明するフローチャートである。図11に示すように、オートマトン判定部240は、まずステップ1002で判定されたDFAの状態列(state_log)と入力文字列のインデックス(idx)とを初期化する。具体的には、最後の停止状態に対するDFAの状態(state_log[last])を、NFAの停止状態(nfa_halt)のみを含むDFA状態とする。また、現在処理中(絞り込みの最中)の入力文字列のインデックス(idx)を、DFAの状態列における最後の停止状態(last)の直前の状態(last-1)とする(ステップ1101)。例えば、DFAの状態列(state_log)が{{0,1,3},{2,3,4},{3,5},{4}}であり、NFAの停止状態が5のとき、DFAの状態列中の停止状態は{3,5}のみである。このとき、最後の停止状態(last)の値は2(0から数えるため)である。すなわち、state_log[last]=[nfa_st_num]は、この例ではstate_log[2]=[5]であり、この結果DFAの状態列が、{{0,1,3},{2,3,4},{5},{4}}となることを意味する。
【0039】次に、オートマトン判定部240は、現在処理中の入力文字列に対するDFAの状態列(state_log[idx])を更新する(ステップ1102)。そして、処理対象となる入力文字列のインデックスを、現在処理中の入力文字列のインデックスの1つ前の状態(idx=idx-1)とし(ステップ1103)、未処理の入力文字列が存在すればステップ1102に戻って処理を実行し、全ての入力文字列に対して処理が行われたならば、DFAの状態列の絞り込み処理を終了する(ステップ1104)。
【0040】図12は、ステップ1102のDFAの状態列(state_log[idx])を更新する処理の詳細を説明するフローチャートである。図12を参照すると、オートマトン判定部240は、まず本処理で使用するメモリ領域(state_buf)を初期化し、本処理において参照するNFA状態へのインデックス(nfa_idx)の値を0とする(ステップ1201)。次に、nfa_idxとstate_log[idx]との要素数を比較する(ステップ1202)。そして、state_log[idx]の要素数の方が大きい場合、参照しているNFA状態(nfa_st)をstate_log[idx][nfa_idx]とし、メモリ領域において当該NFA状態が対応する構文木上のノードへのポインタ(node)をstate_trees[nfa_st]とする(ステップ1203)。そして、構文木におけるノードの文字列表現(node.label)が‘*’または‘|’かどうかを調べる。‘*’または‘|’のいずれかであった場合は、nfa_idxの値を1加算してステップ1202へ戻る(ステップ1204、1208)。
【0041】ノードの文字列表現(node.label)が‘*’または‘|’のいずれでもない場合、オートマトン判定部240は、次に、関数値next(node)について、next(node)∈state_log[idx+1]が成り立つかどうかを調べる(ステップ1204、1205)。これが成り立たないならば、nfa_idxの値を1加算してステップ1202へ戻る(ステップ1208)。一方、next(node)∈state_log[idx+1]が成り立つ場合、オートマトン判定部240は、次に、当該ノードの文字列表現が現在処理中のインデックスに対応する入力文字(input(idx))を受理するかどうかを調べる(ステップ1206)。そして、受理しないならば、nfa_idxの値を1加算してステップ1202へ戻る(ステップ1208)。さらに、ノードの文字列表現が文字列input(idx)を受理する場合、オートマトン判定部240は、次に、メモリ領域state_bufにnfa_stを追加する(ステップ1207)。そして、nfa_idxの値を1加算してステップ1202へ戻る(ステップ1208)。
【0042】ステップ1202〜1208の処理を繰り返してstate_bufに格納されるNFA状態を追加していき、nfa_idxの値がstate_log[idx]の要素数に達したならば、次に、オートマトン判定部240は、ε遷移元の追加処理を行う(ステップ1209)。ε遷移元の追加処理については後述する。この後、オートマトン判定部240は、state_log[idx]をstate_bufに蓄積された処理結果に更新する(ステップ1210)。
【0043】図13は、ε遷移元の追加処理の詳細を説明するフローチャートである。図13を参照すると、オートマトン判定部240は、まず本処理において参照するNFA状態へのインデックス(nfa_idx)の値を0とする(ステップ1301)。次に、nfa_idxとstate_log[idx]との要素数を比較する(ステップ1302)。そして、state_log[idx]の要素数の方が大きい場合、参照しているNFA状態(nfa_st)をstate_log[idx][nfa_idx]とし、メモリ領域において当該NFA状態が対応する構文木上のノードへのポインタ(node)をstate_trees[nfa_st]とする(ステップ1303)。そして、構文木におけるノードの文字列表現(node.label)が‘*’または‘|’かどうかを調べる。‘*’または‘|’のいずれでもない場合は、nfa_idxの値を1加算してステップ1302へ戻る(ステップ1304、1307)。
【0044】ノードの文字列表現(node.label)が‘*’または‘|’であった場合、オートマトン判定部240は、次に、関数値epsdest(node)について、epsdest(node)∈state_bufが成り立つかどうかを調べる(ステップ1304、1305)。これが成り立たないならば、nfa_idxの値を1加算してステップ1302へ戻る(ステップ1307)。一方、epsdest(node)∈state_bufが成り立つ場合、オートマトン判定部240は、次に、メモリ領域state_bufにnfa_stを追加し、ステップ1301へ戻る(ステップ1306)。
【0045】以上の処理を繰り返してstate_bufに格納されるNFA状態を追加していき、nfa_idxの値がstate_log[idx]の要素数に達したならば、ε遷移元の追加処理を終了する。これにより、現在処理中の入力文字列に対するDFAの状態列(state_log[idx])が更新され、DFA状態列の絞り込み処理が完了する。
【0046】次に、上述したDFA状態列の絞り込み処理の具体的な動作例を説明する。ここでは、正規表現“((a*)a)*a”に対して、入力文字列“aaaa”のマッチングを調べる場合を例とする。図14は、正規表現“((a*)a)*a”の適切なNFAを示す図である。図14に示すNFAは、0、1、2、3、4、5という6つの状態を有する。図15は、図14に示したNFAのDFA及び文字列“aaaa”に対する状態遷移を示す図である。図15のDFAを参照すると、入力文字列“aaaa”は受理され、DFAにおける状態遷移は、開始状態が{0,1,2,3,4}であり、最初の文字以降の入力文字列に対するDFAの状態は全て{0,1,2,3,4,5}である。したがって、最長最左規則に従えば、入力文字列“aaaa”のうちの初めの2つの‘a’が正規表現“((a*)a)*a”における‘a*’に部分的にマッチングしているのであるが、DFAからかかる情報を得ることはできない。
【0047】図16は、入力文字列“aaaa”に対するNFA状態の遷移の様子を示す図である。図16(A)には、各NFA状態からの、ε遷移先および当該NFA状態の文字と当該文字に対する遷移先のNFA状態が一覧表示されている。また、図16(B)には、図16(A)に基づいて絞り込まれたDFAの状態列による状態遷移の経路が示されている。
【0048】図14のNFA及び図16(A)の遷移表を参照して、DFAの状態列の絞り込みを考える。まず、図16(A)における最右の列は、NFAの終了状態であるので、図14のNFAに基づいてNFA状態5でなければならない。次に、文字‘a’を1つ入力することでNFA状態5に到達し得るNFA状態は、NFA状態4と、NFA状態4にε遷移するNFA状態3のみである。次に、文字‘a’を1つ入力することでNFA状態4またはNFA状態3に到達し得るNFA状態は、NFA状態2と、NFA状態にε遷移するNFA状態1と、NFA状態1にε遷移するNFA状態3のみである。同様にして、文字‘a’を1つ入力することでNFA状態1、2または3に遷移するNFA状態は、NFA状態0、1、2または3であることがわかる。さらに、文字‘a’を1つ入力することでNFA状態1、2または3に遷移するNFA状態(これが開始状態に相当する)は、NFA状態0、1、2または3であることがわかる。図16(A)では、このようにして抽出される、すなわち絞り込まれたDFAの状態列が斜体字で示されている。
【0049】図16(B)は、上記のようにして絞り込まれたDFAの状態列に関して、開始状態のNFA状態3から終了状態のNFA状態5までの可能な経路を示している。同図において、ε遷移は縦方向の経路で、文字‘a’に対する遷移は横方向の経路で示している。また、NFA状態0へ向かう(1)の表記は、NFA状態0がNFA状態2と同様にNFA状態1から遷移することを意味している。
【0050】次に、オートマトン判定部240による処理(図10参照)におけるステップ1005のマッチ範囲の判定処理について説明する。この処理では、ステップ1004で絞り込まれたDFAの状態列に基づき、適切なNFAにて得られる状態遷移に関する情報を用いて、文字列のマッチ範囲を判定する。これにより、POSIXの最長最左規則に応じた部分正規表現のマッチングや最長一致といった情報が得られることとなる。
【0051】図17は、マッチ範囲の判定処理における動作を説明するフローチャートである。図17に示すように、オートマトン判定部240は、まずレジスタに格納される各種のパラメータを初期化する(ステップ1701)。具体的には、現在参照しているNFA状態(nfa_state)をオートマトン保持部220から入力した適切なNFAの開始状態(nfa_init)とし、部分正規表現がマッチした部分を示すデータmatches[i]=(−1,−1)(0≦i≦MAX)を設定して、処理対象の文字列中で現在参照しているインデックス(idx)をidx=matches[0].first=0とする。
【0052】そして、オートマトン判定部240は、レジスタの更新処理(ステップ1702)、現在参照しているNFA状態の次のNFA状態への遷移処理(ステップ1703)を行う。これらの処理については後述する。次に、オートマトン判定部240は、NFA状態(nfa_state)が停止状態(nfa_halt)かどうかを判断する(ステップ1704)。そして、nfa_state=nfa_haltでなければ、ステップ1702に戻って処理を繰り返し、nfa_state=nfa_haltであれば、マッチ範囲の判定処理を終了する。
【0053】図18は、レジスタの更新処理の詳細を説明するフローチャートである。図18を参照すると、オートマトン判定部240は、まず変数iを初期化(i=0)して(ステップ1801)、NFA状態(nfa_state)が部分正規表現の範囲に含まれるかどうか(subexps[i].first≦nfa_state<subexps[i].last)を判断する(ステップ1802)。NFA状態がこの範囲に含まれていない場合は、データmatches[i].lastをインデックス(idx)の値(初期的にはi=0であるので、図17のステップ1701からmatches[0].last=matches[0].first=0となる)とする(ステップ1803)。そして、変数iの値を1加算し(ステップ1806)、変数iの値が図17のステップ1701で設定したMAXに達していなければステップ1802に戻る(ステップ1807)。
【0054】ステップ1802において、NFA状態が部分正規表現の範囲に含まれている場合、オートマトン判定部240は、次に、matches[i].first=−1またはmuches[i].last≠−1が成り立つかどうかを調べる(ステップ1804)。この関係が成り立つならば、データmatches[i].firstをインデックス(idx)の値とし、データmatches[i].lastの値を−1とする(ステップ1805)。そして、変数iの値を1加算し(ステップ1806)、変数iの値が図17のステップ1701で設定したMAXに達していなければステップ1802に戻る(ステップ1807)。また、ステップ1804でmatches[i].first=−1またはmuches[i].last≠−1が成り立たない場合は、データに対しては何らの処理も行わず、変数iの値を1加算し(ステップ1806)、変数iの値が図17のステップ1701で設定したMAXに達していなければステップ1802に戻る(ステップ1807)。以上のようにしてステップ1802〜1807の処理を繰り返し、変数iの値がMAXに達したならば、レジスタの更新処理を終了する。
【0055】図19は、次のNFA状態への遷移処理の詳細を説明するフローチャートである。図19を参照すると、オートマトン判定部240は、まず、現在参照しているNFA状態が対応するメモリ領域における構文木上のノードへのポインタ(node)をstate_trees[nfa_state]とする(ステップ1901)。そして、構文木におけるノードの文字列表現(node.label)が‘*’または‘|’かどうかを調べる。‘*’または‘|’であった場合は、集合epsdest(node)のうちの最も番号の小さい状態をNFA状態(nfa_state)とする(ステップ1902、1903)。一方、構文木におけるノードの文字列表現(node.label)が‘*’または‘|’のいずれでもない場合は、NFA状態(nfa_state)を次のノード(next(node))として処理を終了する(ステップ1902、1904)。
【0056】次に、上述したマッチ範囲の判定処理の具体的な動作例を説明する。ここでは、図14乃至図16を参照して説明した、正規表現“((a*)a)*a”に対して、入力文字列“aaaa”のマッチングを調べる場合を例として説明する。図16に示したように、図10のステップ1004におけるDFA状態列の絞り込み処理により、適切なNFAの開始状態から終了状態へ至る、可能な状態列が抽出されている。図20は、図16に示された遷移表(図16(A))及び絞り込まれたDFA状態列による状態遷移の経路(図16(B))に基づいて、マッチ範囲を判定する様子を示す図である。なお、図20(A)の遷移表では、DFA状態列の絞り込みにより削除されたNFA状態を括弧付きの数字で記述してある。
【0057】図20(A)(B)を参照して可能なDFA状態列をたどると、まずNFAの開始状態3からNFA状態1へ遷移し、次にNFA状態0またはNFA状態2へ遷移が可能である。しかし、POSIXの最長最左規則に従って、先に出現する繰り返しを可能な限り多く選択するため、遷移先はNFA状態0となる。続いて、NFA状態0からNFA状態1へ遷移し、次にNFA状態0またはNFA状態2へ遷移が可能となる。ここでも最長最左規則に従って、遷移先としてNFA状態0が選択される。この後、NFA状態0からNFA状態1、NFA状態2、NFA状態3、NFA状態4、NFA状態5と遷移して終了状態に至る。図20(A)(B)では、このようにして選択されたDFA状態列が斜体字で示されている。
【0058】以上のようにして、正規表現“((a*)a)*a”に対して、入力文字列“aaaa”がマッチングした際にたどるべきNFA状態列が復元された。図21は、復元されたNFA状態列を示す図である。図21において、状態遷移を示す矢印に文字‘a’が付されているものが文字に対する遷移であり、文字‘a’が付されていないものがε遷移である。図21から、入力文字列“aaaa”のうち、初めの2つの文字‘a’がNFA状態0からNFA状態1への遷移に対応しており、正規表現“((a*)a)*a”における2重括弧の内側の‘a*’にマッチングしていることがわかる。同様にして、3番目の文字‘a’が正規表現における外側の括弧内の‘a’にマッチングし、最後の文字‘a’が正規表現における最も外側の‘a’にマッチングしていることがわかる。
【0059】このようにして、入力文字列のどの文字が正規表現におけるどの部分にマッチングしているかという情報が得られることとなる。以上のようなパターンマッチングを、NFAを用いて行う場合、処理に要する時間はO(2n)程度であり、入力nに対して2のn乗に比例した時間を要する。これに対し、本実施の形態では、DFAを用いたパターンマッチングに要する時間がO(n)程度であり、DFA状態の絞り込み処理及びマッチ範囲の判定処理に要する時間がO(n)程度であって、いずれも入力nに対してnに比例した時間で完了する。したがって、本実施の形態は、NFAを用いた処理と比して、処理に要する時間を大幅に短縮することができる。
【0060】ここで、本実施の形態を具体的なテキストファイルにおける文字列検索に用いた例について説明する。住所録が入ったテキストファイルがあるとする。このテキストファイルにおいて、名前などの各項目は‘,’で区切られており、最初の項目は名前である。しかし、1つのエントリにどのような項目があるかは統一されていないとする。今、この住所録のテキストファイルに次のようなエントリが並んでいるものとする。
日本太郎,taro@yamato.ibm.com,046-xxx-xxxx,神奈川県大和市大和東X-X-X大和次郎,Yamato Jiro,jiro@jp.ibm.com,神奈川県大和市下鶴間X-X-Xこのテキストファイルから、住所が「神奈川県大和市」で電子メールアドレスにibm.comという文字列が含まれる人の名前と電子メールアドレスを列挙する作業を考える。このような場合、正規表現を用いると容易に検索することができる。例えば、次の正規表現で検索可能である。
([^,]*),([^,]*,)*([^,]*@[^,]*ibm.com),([^,]*,)*神奈川県大和市この正規表現において、[^,] は、‘,’以外の任意の文字にマッチし、*は0回以上の繰り返しである。よって、[^,]*は、上記テキストファイルのエントリにおける項目1つ分にマッチする。例えば、最初の ([^,]*), は名前と直後の‘,’にマッチし、括弧で括られた部分が名前にマッチすることとなる。また、([^,]*,)*は、所定の項目と‘,’の0回以上の繰り返し、すなわちに名前とメールアドレスの間にある任意個の項目にマッチする。さらに、文字@及び文字列ibm.comを含む([^,]*@[^,]*ibm.com) は、メールアドレスにマッチする。そして、これ以降、0個以上の項目にマッチし、最後に“神奈川県大和市”にマッチする。
【0061】これを従来のDFAで処理すると、正規表現中の括弧‘(’‘)’で囲われた部分が元の文章のどこにマッチしたか分からないため、名前やメールアドレスといった特定の項目を抜き出すことができない。一方、NFAでは実行に入力の長さの指数関数時間かかってしまう。しかしながら、上記第1の実施の形態においては、DFAを用いたパターンマッチングにより短時間で文字列の照合を行うことができ、さらにマッチした文字列に対してDFA状態列の絞り込み及びNFA状態列の復元によるマッチ範囲の判定を行うことによって、どの項目が正規表現のどの部分にマッチしたかという情報が得られるため、所望の項目を取り出すことが可能となる。
【0062】[第2の実施の形態]第2の実施の形態は、上述した第1の実施形態と同様に、正規表現で表現された検索条件に基づき、DFA(決定性有限状態オートマトン)を用いて文字列検索を行う文書処理システムをコンピュータにて実現する。そして、検索キーとなる文字列に対して、複数文字照合要素を許容する。このシステムは、DFAを用いて文字列のパターンマッチングを行う際に、入力文字列を先読みすることにより、複数文字照合要素が含まれているか否かを判定する。また、入力文字列がマッチするかどうか(DFAに受理されるかどうか)を判定する際に、DFAの状態遷移における遷移先の状態を動的に決定し、かつ動的に生成しながら評価を行う。
【0063】第2の実施の形態による文書処理システムは、図1に例示された第1の実施の形態による文書処理システムと同様のコンピュータ装置にて実現される。また、図2に示された第1の実施の形態による文書処理システムと同様のシステム構成を備える。そこで、本実施の形態では、各構成要素を図1及び図2で用いた符号を付して説明することとし、文書処理システムを実現するコンピュータ装置のハードウェア構成及びシステムの機能構成については説明を省略する。
【0064】また、第2の実施の形態において、オートマトン構築部210の動作は、図3乃至図9を参照して説明した、第1の実施の形態におけるオートマトン構築部210の動作と同様である。そこで、本実施の形態においては、オートマトン構築部210の動作についての説明を省略する。
【0065】第2の実施の形態におけるオートマトン判定部240は、概略的に、第1の実施の形態におけるオートマトン判定部240と同様に動作する。すなわち、図10に示すように、オートマトン保持部220に格納されているDFAと、文書保持部230に格納されている検索対象の文字列(文書データ)とを入力し(ステップ1001)、DFAにより入力文字列のマッチングを行い(ステップ1002)、DFA状態列の絞り込み処理およびマッチ範囲の判定処理を行って(ステップ1003〜1005)、処理結果を出力する(ステップ1006、1007)。
【0066】ここで、第1の実施の形態では、ステップ1002における文字列のマッチング処理に公知の手法を用いることとした。これに対し、第2の実施の形態では、複数文字照合要素に対応するため、DFAの状態遷移を動的に決定し生成しながら評価を行う。図22、23は、第2の実施の形態におけるDFAによる入力文字列の判定処理を説明するフローチャートである。図22、23を参照すると、オートマトン判定部240は、まず、処理対象である入力文字列のインデックス(idx)を初期化(idx=0)し、DFAの状態列(state_log[0])をNFAの開始状態(nfa_init)におけるeclosure(nfa_init)とする(ステップ2201)。ここで、eclosure(state:NFA状態)は、epsdest(state)∪epsdest(state)の各要素をstate'としてepsdest(state')...と拡張した最大の集合である。また、本処理において参照するNFA状態へのインデックス(nfa_idx)の値を0とする(ステップ2202)。
【0067】次に、nfa_idxとstate_log[idx]との要素数を比較する(ステップ2203)。そして、state_log[idx]の要素数の方が大きい場合、参照しているNFA状態(nfa_st)をstate_log[idx][nfa_idx]とし、メモリ領域において当該NFA状態が対応する構文木上のノードへのポインタ(node)をstate_trees[nfa_st]とする(ステップ2204)。そして、構文木におけるノードの文字列表現(node.label)が‘*’または‘|’かどうかを調べる。‘*’または‘|’であった場合は、nfa_idxの値を1加算してステップ2203へ戻る(ステップ2205、2212)。
【0068】ステップ2205において、ノードの文字列表現(node.label)が‘*’または‘|’のいずれでもない場合、オートマトン判定部240は、次に、入力文字列が現在処理中のインデックス(idx)を先頭とする複数文字照合要素を持つかどうかを調べる(ステップ2206)。複数文字照合要素がある場合、データmblenを、mblen=入力文字列のインデックス(idx)から始まる複数文字照合要素の長さのように定義し(ステップ2207)、次に、当該NFA状態が対応する構文木上のノードが当該複数文字照合要素を受理可能かどうかを調べる(ステップ2208)。そして、受理可能であれば、DFAの状態列state_log[idx+mblen]にeclosure(next(node))を追加する(ステップ2209)。
【0069】ステップ2206で入力文字列が複数文字照合要素を持たないと判断された場合、またはステップ2208でノードが複数文字照合要素を受理不可能と判断された場合、またはノードが複数文字照合要素を受理可能と判断されてステップ2209の処理が行われた後、オートマトン判定部240は、処理中のノードに対応する正規表現の文字列表現(node.label)が当該インデックスの入力(input(idx))を受理したかどうかを調べる(ステップ2210)。そして、受理したならば、DFAの状態列state_log[idx+1]にeclosure(next(node))を追加する(ステップ2211)。ステップ2210で処理中のノードに対応する正規表現の文字列表現(node.label)が当該インデックスの入力(input(idx))を受理しなかった場合、または、ステップ2211の処理の後、nfa_idxの値を1加算してステップ2203へ戻る(ステップ2212)。
【0070】ステップ2203〜2212の処理を繰り返し、nfa_idxの値がstate_log[idx]の要素数に達したならば、次に、オートマトン判定部240は、入力文字列のインデックス(idx)を1つ進め(ステップ2213)、入力文字列のインデックスが当該入力文字列の最後の文字に達したか、またはstate_log[i]=0(i≧idx)が成り立つかどうかを調べる(ステップ2214)。これがいずれも成り立たない場合は、ステップ2202に戻って処理を繰り返し、いずれかが成り立つ場合は、DFAによる入力文字列の判定処理を終了する。
【0071】次に、オートマトン判定部240は、図10に示すように、DFA状態列の絞り込み処理(ステップ1004)を行う。第2の実施の形態におけるDFA状態列の絞り込み処理は、図11に示した第1の実施の形態における処理と概ね同様であるが、state_log[idx]の更新処理(ステップ1102)において、複数文字照合要素に対応する点が異なっている。図24、25は、本実施の形態におけるDFA状態列の絞り込み処理を説明するフローチャートである。図24、25において、ステップ2401からステップ2404までの処理は、図12のステップ1201からステップ1204までの処理と同様であり、ステップ2412からステップ2414までの処理は、図12のステップ1208からステップ1210までの処理と同様である。
【0072】ステップ2404で、ノードの文字列表現(node.label)が‘*’または‘|’のいずれでもない場合、オートマトン判定部240は、次に、入力文字列が現在処理中のインデックス(idx)を先頭とする複数文字照合要素を持つかどうかを調べる(ステップ2405)。複数文字照合要素がある場合、データmblenを、mblen=入力文字列のインデックス(idx)から始まる複数文字照合要素の長さのように定義し(ステップ2406)、次に、当該NFA状態が対応する構文木上のノードが当該複数文字照合要素を受理可能かどうかを調べる(ステップ2407)。そして、受理可能であれば、さらに関数値next(node)について、next(node)∈state_log[idx+mblen]が成り立つかどうかを調べる(ステップ2408)。
【0073】ステップ2405で入力文字列が複数文字照合要素を持たないと判断された場合、またはステップ2407でノードが複数文字照合要素を受理不可能と判断された場合、またはステップ2408でnext(node)∈state_log[idx+mblen]が成り立たないと判断された場合、オートマトン判定部240は、次に、関数値next(node)について、next(node)∈state_log[idx+1]が成り立つかどうかを調べる(ステップ2409)。これが成り立たないならば、nfa_idxの値を1加算してステップ2402へ戻る(ステップ2412)。一方、ステップ2409でnext(node)∈state_log[idx+1]が成り立つ場合、オートマトン判定部240は、次に、当該ノードの文字列表現が現在処理中のインデックスに対応する入力文字(input(idx))を受理するかどうかを調べる(ステップ2410)。そして、受理しないならば、nfa_idxの値を1加算してステップ2402へ戻る(ステップ2412)。さらに、ステップ2410でノードの文字列表現が入力文字input(idx)を受理する場合、またはステップ2408でnext(node)∈state_log[idx+idx]が成り立つ場合、オートマトン判定部240は、次に、メモリ領域state_bufにnfa_stを追加する(ステップ2411)。そして、nfa_idxの値を1加算してステップ2402へ戻る(ステップ2412)。上述したように、これ以降の動作は図12に示した第1の実施の形態における動作と同様である。
【0074】次に、オートマトン判定部240は、図10に示すように、マッチ範囲の判定処理(ステップ1005)を行う。第2の実施の形態におけるマッチ範囲の判定処理は、図11に示した第1の実施の形態における処理と概ね同様であるが、次のNFA状態への遷移処理(ステップ1703)において、複数文字照合要素に対応する点が異なっている。図26は、本実施の形態におけるマッチ範囲の判定処理を説明するフローチャートである。図26において、ステップ2601からステップ2603までの動作は、図19のステップ1901からステップ1903までの動作と同様である。
【0075】ステップ2602で、構文木におけるノードの文字列表現(node.label)が‘*’または‘|’のいずれでもない場合、オートマトン判定部240は、次に、入力文字列が現在処理中のインデックス(idx)を先頭とする複数文字照合要素を持つかどうかを調べる(ステップ2604)。そして、複数文字照合要素を持たないならば、現在処理中のインデックス(idx)を1つ進め(ステップ2608)、NFA状態(nfa_state)を次のノード(next(node))として処理を終了する(ステップ2609)。
【0076】ステップ2604で入力文字列が複数文字照合要素を持つと判断された場合、データmblenを、mblen=入力文字列のインデックス(idx)から始まる複数文字照合要素の長さと定義し(ステップ2605)、次に、当該NFA状態が対応する構文木上のノードが当該複数文字照合要素を受理可能かどうかを調べる(ステップ2606)。そして、受理可能であれば、state_log[idx+mblen]にeclosure(next(node))を追加して(ステップ2607)、NFA状態(nfa_state)を次のノード(next(node))として処理を終了する(ステップ2609)。また、ステップ2606でノードが複数文字照合要素を受理不可能と判断された場合、現在処理中のインデックス(idx)を1つ進め(ステップ2608)、NFA状態(nfa_state)を次のノード(next(node))として処理を終了する(ステップ2609)。
【0077】次に、第2の実施の形態におけるDFAによる入力文字列の判定処理の具体的な動作例を説明する。ここでは、正規表現“[a-b]c|aab”に対して、入力文字列“aac”のマッチングを調べる場合を例とする。なお、“aa”は有効な複数文字照合要素であり、すなわち“aa”∈“[a-b]”である。図27は、オートマトン構築部210にて作成された正規表現“[a-b]c|aab”の適切なNFAを示す図である。図27に示すNFAは0、1、2、3、4、5、6という7つの状態を有する。図28乃至図33は、オートマトン判定部240において、DFAの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図である。
【0078】図27及び図28を参照すると、まず、NFAの開始状態であるNFA状態2に対応するDFAの開始状態{0,2,3}が生成される。なお、この例では、入力文字列“aac”の各文字に対して対応するDFAの各状態が生成されていくこととなる。
【0079】次に、入力文字列“aac”の最初の文字‘a’に対する処理が行われる。図27に示すNFAを参照すると、入力文字‘a’に対してNFA状態0からNFA状態1またはNFA状態3からNFA状態4へ遷移可能であるため、図29に示すように状態{1,4}が生成される。ここで、入力文字列の先読みが行われ、1番目の文字が‘a’であることから、1番目と2番目の文字列がが複数文字照合要素“aa”である可能性がある。そこで、図27のNFAに基づき、この文字列が複数文字照合要素“aa”であった場合の遷移先として、図30に示すように状態{1}が仮に生成される。なお、この状態{1}は先読みによる不完全な状態なので、図30では破線で示してある。
【0080】次に、入力文字列の2番目の文字‘a’に対する処理が行われる。図27に示すNFAを参照すると、NFA状態1から文字‘a’に対する遷移はなく、NFA状態4からNFA状態5へ遷移するのみであるため、図31に示すように状態{5}が生成される。ここで、入力文字列の1番目と2番目の複数文字照合要素“aa”が“[a-b]”に該当してNFA状態0からNFA状態1へ遷移するか、または各文字‘a’に対してNFA状態3→NFA状態4→NFA状態5と遷移するかのいずれかであることがわかった。そこで、図32に示すように、状態{1}と状態{5}とを融合した状態{1,5}を生成する。
【0081】次に、図27のNFAより、入力文字‘c’に対してNFA状態1からNFA状態6に遷移し、入力文字‘b’に対してNFA状態5からNFA状態6に遷移することがわかる。そこで、図33に示すように、状態{6}が生成される。これらはNFAの終了状態であるため、以上で入力文字列“aac”に対するDFAの状態遷移における遷移先の状態を動的な生成が完了する。なお、入力文字列“aac”の最後の文字は‘c’であるから、終了状態{6}へ到達し、当該入力文字列“aac”はこのDFAにマッチすることがわかる。
【0082】このようにして、複数文字照合要素を含む正規表現に対しても、DFAを用いて高速なパターンマッチングを行うことが可能となる。以上のようなパターンマッチングを、NFAを用いて行う場合、処理に要する時間はO(2n)程度であり、入力nに対して2のn乗に比例した時間を要する。これに対し、本実施の形態では、DFAを用いたパターンマッチングに要する時間がO(n)程度であり、入力nに対してnに比例した時間で完了する。したがって、本実施の形態は、NFAを用いた処理と比して、処理に要する時間を大幅に短縮することができる。また、照合要素の文字数を可変とすることができるため、日本語の文字のようなマルチバイトキャラクタに対する文字検索にも、DFAを用いた高速なパターンマッチングを適用することが可能となる。
【0083】なお、第2の実施の形態は、第1の実施の形態に加えて、入力文字列の判定時にDFAの状態遷移における遷移先の状態を動的に決定し生成することとしたが、かかる手法を、第1の実施の形態による手法(すなわち、DFAの絞り込み及びNFA状態の復元により、入力文字列中の部分正規表現がマッチした部分に関する情報を得る手法)とは独立して用いることも可能である。この場合も、上述したように複数文字照合要素を含む正規表現に対して、DFAを用いて高速なパターンマッチングを行うことが可能である。しかしながら、上記のように第1の実施の形態と組み合わせて用いることにより、backreferenceにも応用することが可能である。ここで、backreferenceとは、「指定した部分正規表現がマッチした文字列に待ちする演算子」をいう。例えば、正規表現“(ab(cd))\1\2”は、“abcdabcdcd”にマッチするが、この場合の\1及び\2がbackreferenceである。\1、\2の1、2が部分正規表現の出現順を示しており、例えば正規表現“(ab(cd))”の場合、外側の(最初に出現している)括弧に囲われた“(ab(cd))”が\1に対応し、次に出現する内側の括弧内の“(cd)”が\2に対応する。そして、それぞれのマッチした文字列“abcd”、“cd”に、\1、\2がマッチする。同様に、正規表現“(ab)(cd)\2\1”は、“abcdcdab”にマッチし、“(a+)\1”は、“aa”、“aaaa”、“aaaaaa”、・・・、すなわち偶数個のaの文字列にマッチする。このとき、文字列のうちの前半分が(a+)にマッチし、後ろ半分が\1にマッチする。このように、backreferenceは、「\1が出現するまでの部分正規表現が何にマッチしたか」という情報が必要であり、さらにbackreference自身は、「1つの演算子で複数の文字にマッチ」する。この2つの条件のうち、前者に第1の実施の形態で対応し、後者に第2の実施の形態で対応することにより、backreferenceを用いた文字列の照合、検索を行うことが可能となる。
【0084】
【発明の効果】以上説明したように、本発明によれば、部分正規表現や最長一致を含むPOSIX正規表現をDFA(決定性有限状態オートマトン)にて処理することが可能となる。また、本発明によれば、複数文字照合要素を含む正規表現をDFA(決定性有限状態オートマトン)にて処理することが可能となる。
【出願人】 【識別番号】390009531
【氏名又は名称】インターナショナル・ビジネス・マシーンズ・コーポレーション
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【住所又は居所】アメリカ合衆国10504、ニューヨーク州 アーモンク ニュー オーチャード ロード
【出願日】 平成14年2月5日(2002.2.5)
【代理人】 【識別番号】100086243
【弁理士】
【氏名又は名称】坂口 博 (外3名)
【公開番号】 特開2003−242179(P2003−242179A)
【公開日】 平成15年8月29日(2003.8.29)
【出願番号】 特願2002−28736(P2002−28736)