(57)【要約】【課題】一定の範囲の属性値を検索するための正規表現を効率的に生成することを目的とする。【解決手段】演算部１０２は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す書式に基づいて、属性範囲条件データが示す下限値と最上位桁が同じ値でそれ以外の桁が各桁の最大値である第１の値と、属性範囲条件データが示す上限値と最上位桁が同じ値でそれ以外の桁が各桁の最小値である第２の値とを演算する。正規表現生成部１０４は、下限値から第１の値までの属性値を正規表現で表す下位領域データと第２の値から上限値までの属性値を正規表現で表す上位領域データとを生成するとともに、第１の値と第２の値との間に属性値が存在する場合には当該属性値を正規表現で表す中位領域データを生成する。正規表現結合部１０５は、下位領域データと上位領域データと中位領域データとを結合する。【選択図】図１
2008146162.tif 000002
【特許請求の範囲】
【請求項１】
属性値の下限値と上限値と書式とを示す属性範囲条件データを入力装置から入力する属性範囲条件入力部と、
前記属性範囲条件入力部により入力された属性範囲条件データが示す書式に基づいて、前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値以上の属性値であって、最下位桁から少なくとも１桁が当該桁の最大値である第１の値と、前記属性範囲条件入力部により入力された属性範囲条件データが示す上限値以下の属性値であって、最下位桁から少なくとも１桁が当該桁の最小値である第２の値とを、処理装置で演算する演算部と、
前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値と上限値と、前記演算部により演算された第１の値と第２の値とを、記憶装置に記憶する属性値記憶部と、
前記属性値記憶部により記憶された下限値から第１の値までの属性値を正規表現で表す下位領域データと、前記属性値記憶部により記憶された第２の値から上限値までの属性値を正規表現で表す上位領域データとを、処理装置で生成するとともに、前記属性値記憶部により記憶された第１の値と第２の値との間に属性値が存在する場合には当該属性値を正規表現で表す中位領域データを処理装置で生成する正規表現生成部と、
前記正規表現生成部により生成された下位領域データと上位領域データと中位領域データとを処理装置で結合して、前記属性値記憶部により記憶された下限値から上限値までの属性値を正規表現で表す正規表現データを生成する正規表現結合部とを備えることを特徴とする正規表現生成装置。
【請求項２】
前記演算部は、前記属性範囲条件入力部により入力された属性範囲条件データが示す書式に基づいて、前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値と桁数が同じで少なくとも最上位桁以外の桁が各桁の最大値である第１の値と、前記属性範囲条件入力部により入力された属性範囲条件データが示す上限値と桁数が同じで少なくとも最上位桁以外の桁が各桁の最小値である第２の値とを、演算することを特徴とする請求項１に記載の正規表現生成装置。
【請求項３】
前記演算部は、前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値と最上位桁が同じ値でそれより以外の桁が各桁の最大値である第１の値と、前記属性範囲条件入力部により入力された属性範囲条件データが示す上限値と最上位桁が同じ値でそれ以外の桁が各桁の最小値である第２の値とを、演算することを特徴とする請求項２に記載の正規表現生成装置。
【請求項４】
前記属性範囲条件入力部は、属性値の書式として、属性値が数値と文字列とのいずれかであることを示す属性範囲条件データを入力することを特徴とする請求項１に記載の正規表現生成装置。
【請求項５】
前記属性範囲条件入力部は、属性値の書式として、属性値が区切り文字を用いた階層構造をとる属性値であり、属性値全体を区切り文字で区切った部分の各々が前記階層構造の１階層であることを示す属性範囲条件データを入力し、
前記演算部は、属性値全体について、各階層を１桁として、第１の値と第２の値とを演算し、
前記正規表現生成部は、属性値全体について、各階層を１桁として、下位領域データと上位領域データとを生成した後に、下位領域データと上位領域データとを各階層を正規表現で表すものに変換するとともに、第１の値と第２の値との間に属性値が存在する場合には中位領域データを生成し、さらに、各階層を正規表現で表すものに変換することを特徴とする請求項１に記載の正規表現生成装置。
【請求項６】
前記属性範囲条件入力部は、属性値の書式として、属性値が日付と時刻とＩＰ（Ｉｎｔｅｒｎｅｔ・Ｐｒｏｔｏｃｏｌ）アドレスとのいずれかであることを示す属性範囲条件データを入力することを特徴とする請求項５に記載の正規表現生成装置。
【請求項７】
前記正規表現生成装置は、さらに、
所定の構文規則に従って記述されたテキストの特定の領域を示すテキスト範囲条件データを入力装置から入力するテキスト範囲条件入力部を備え、
前記属性範囲条件入力部は、属性値の書式として、属性値が前記テキスト範囲条件入力部により入力されたテキスト範囲条件データが示す領域に含まれることを示す属性範囲条件データを入力し、
前記正規表現生成部は、さらに、前記テキスト範囲条件入力部により入力されたテキスト範囲条件データが示す領域を正規表現で表すテキスト領域データを処理装置で生成し、
前記正規表現結合部は、前記属性範囲条件入力部により入力された属性範囲条件データが示す書式に基づいて、前記正規表現生成部により生成された下位領域データと上位領域データと中位領域データとテキスト領域データとを結合して、属性値を含む前記テキストの特定の領域を正規表現で表す正規表現データを生成することを特徴とする請求項１に記載の正規表現生成装置。
【請求項８】
前記テキスト範囲条件入力部は、前記テキストの特定の領域として、電子メールの特定のヘッダフィールドを示すテキスト範囲条件データを入力することを特徴とする請求項７に記載の正規表現生成装置。
【請求項９】
前記テキスト範囲条件入力部は、前記テキストの特定の領域として、前記テキストを区切り文字で区切ったフィールドのいずれかを示すテキスト範囲条件データを入力することを特徴とする請求項７に記載の正規表現生成装置。
【請求項１０】
前記正規表現生成装置は、さらに、
複数の属性範囲条件データと複数のテキスト範囲条件データとを予め記憶装置に記憶しておくとともに、各属性範囲条件データと各テキスト範囲条件データとの組み合わせを一意の識別子と対応付けて予め記憶装置に記憶しておく条件記憶部と、
任意の識別子を入力装置から入力する識別子入力部とを備え、
前記属性範囲条件入力部は、前記識別子入力部により入力された識別子に対応付けて前記条件記憶部により記憶された組み合わせの属性範囲条件データを入力し、
前記テキスト範囲条件入力部は、前記識別子入力部により入力された識別子に対応付けて前記条件記憶部により記憶された組み合わせのテキスト範囲条件データを入力することを特徴とする請求項７に記載の正規表現生成装置。
【請求項１１】
正規表現生成装置の属性範囲条件入力部が、属性値の下限値と上限値と書式とを示す属性範囲条件データを入力装置から入力し、
前記正規表現生成装置の演算部が、前記属性範囲条件入力部により入力された属性範囲条件データが示す書式に基づいて、前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値以上の属性値であって、最下位桁から少なくとも１桁が当該桁の最大値である第１の値と、前記属性範囲条件入力部により入力された属性範囲条件データが示す上限値以下の属性値であって、最下位桁から少なくとも１桁が当該桁の最小値である第２の値とを、処理装置で演算し、
前記正規表現生成装置の属性値記憶部が、前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値と上限値と、前記演算部により演算された第１の値と第２の値とを、記憶装置に記憶し、
前記正規表現生成装置の正規表現生成部が、前記属性値記憶部により記憶された下限値から第１の値までの属性値を正規表現で表す下位領域データと、前記属性値記憶部により記憶された第２の値から上限値までの属性値を正規表現で表す上位領域データとを、処理装置で生成し、
前記正規表現生成装置の正規表現生成部が、前記属性値記憶部により記憶された第１の値と第２の値との間に属性値が存在する場合には当該属性値を正規表現で表す中位領域データを処理装置で生成し、
前記正規表現生成装置の正規表現結合部が、前記正規表現生成部により生成された下位領域データと上位領域データと中位領域データとを処理装置で結合して、前記属性値記憶部により記憶された下限値から上限値までの属性値を正規表現で表す正規表現データを生成することを特徴とする正規表現生成方法。
【請求項１２】
属性値の下限値と上限値と書式とを示す属性範囲条件データを入力装置から入力する属性範囲条件入力処理と、
前記属性範囲条件入力処理により入力された属性範囲条件データが示す書式に基づいて、前記属性範囲条件入力処理により入力された属性範囲条件データが示す下限値以上の属性値であって、最下位桁から少なくとも１桁が当該桁の最大値である第１の値と、前記属性範囲条件入力処理により入力された属性範囲条件データが示す上限値以下の属性値であって、最下位桁から少なくとも１桁が当該桁の最小値である第２の値とを、処理装置で演算する演算処理と、
前記属性範囲条件入力処理により入力された属性範囲条件データが示す下限値と上限値と、前記演算処理により演算された第１の値と第２の値とを、記憶装置に記憶する属性値記憶処理と、
前記属性値記憶処理により記憶された下限値から第１の値までの属性値を正規表現で表す下位領域データと、前記属性値記憶処理により記憶された第２の値から上限値までの属性値を正規表現で表す上位領域データとを、処理装置で生成するとともに、前記属性値記憶処理により記憶された第１の値と第２の値との間に属性値が存在する場合には当該属性値を正規表現で表す中位領域データを処理装置で生成する正規表現生成処理と、
前記正規表現生成処理により生成された下位領域データと上位領域データと中位領域データとを処理装置で結合して、前記属性値記憶処理により記憶された下限値から上限値までの属性値を正規表現で表す正規表現データを生成する正規表現結合処理とをコンピュータに実行させることを特徴とする正規表現生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、正規表現生成装置及び正規表現生成方法及び正規表現生成プログラムに関するものである。本発明は、特に、正規表現を用いた検索条件生成装置、検索条件生成方式、検索条件生成プログラムに関するものである。
【背景技術】
【０００２】
検索のために入力された検索条件（キーワード）を、異なった表記でも類似した表記でも検索可能なように正規表現に変換し、検索対象に誤字脱字が含まれている場合や改行コードが含まれている場合でも検索できるようにする技術が公知である（例えば、特許文献１参照）。
【０００３】
検索対象としては、例えば、ログを保存するデータベースが挙げられる。近年、ログは多様化、大規模化しており、ログを効率的に管理するためのログ専用データベース管理システムの必要性が高まっている（例えば、非特許文献１参照）。
【特許文献１】特開平７−１２１５４７号公報
【非特許文献１】中村隆顕、他３名、「大規模ログデータベースの実現」、情報処理学会第６８回（平成１８年）全国大会講演論文集（３）、ｐｐ．２９−３０、２００６年３月
【発明の開示】
【発明が解決しようとする課題】
【０００４】
情報セキュリティの分野を中心に、ログを収集・保存・分析する動きが進んでいる。ここでいうログには、サーバなどの情報機器の動作履歴・アクセス履歴、セキュリティ機器やソフトウェアが記録するイベントの履歴、ネットワーク上の通信履歴、電子メールの送受信履歴（メールの内容も含む）などがある。これらログの多くはテキストの情報として記録され、そのログの出力元ごとに個別に管理されてきた。情報セキュリティの分野において、これら多種多様な情報源から出力されたログを収集し、一元的に管理することにより、情報漏洩などの事件が発生した場合に、その証拠保全・原因究明などに役立てようという動きが進んでいる。
【０００５】
ログには次のような特徴がある。
【０００６】
ログは、常に生成され続けるものであるため、その量も時間の経過と共に増加し続ける。また、上記のような目的で収集する場合は、数ヵ月〜数年単位という長期間保存し続ける必要があり、その量は膨大なものとなる。また、ログはその出力元ごとに出力する内容が異なり、多様な形式が存在する。形式については、日時や数値の情報を含むものが多く、自由度に差はあるものの、書式が決まっている場合が多い。ただ、その書式はログの情報源によって個別に決まっており、共通の書式があるわけではない。
【０００７】
そのため、従来の電子文書の検索装置においては、文書に含まれる属性情報を検索する場合には、文書から事前に属性値（属性の値のことであるが、以下では、単に「属性」という場合がある）を抽出しておいて、専用のファイルに記録して管理するものや、リレーショナルデータベース管理システムなどを利用して管理することが一般的であった。
【０００８】
しかし、ログには上で述べたような書式の多様性があるため、保存するログの種類を増やした場合に、事前に属性を抽出する方式では、属性の抽出方法を定義しない限り属性情報を抽出して保存することができないという課題があった。また、抽出したい属性の種類を追加する場合にも、時間の経過と共に増加し続けるログを長期間保存しているとその量が膨大なものとなるため、保存済みの全てログから属性を抽出し直すことは困難であるという課題があった。
【０００９】
このようなログの保存・検索には、非特許文献１に示すようなログ専用データベースが有効である。このログ専用データベースは、以下のような方針に基づいて設計されている。
（１）ログの形式は意識せず、収集してきたログをそのままの形式で記憶媒体に保存する。
（２）ログの書式を意識した検索条件により検索する。
【００１０】
そうすることにより、以下のような効果がある。
（１）ログからの属性抽出などを行わないため、ありとあらゆる形式のログの保存が可能。
（２）ログの書式を意識した検索条件を正規表現により指定することにより、検索対象の属性などを柔軟に指定することが可能。
【００１１】
ここで、正規表現とは、文字列による検索条件の表記法の一種である。正規表現では、検索文字列の一部に、複数文字や文字列からの選択、また、それらの繰り返しの指定を許すことにより、検索条件をより一般化して表記することが可能である。
【００１２】
上記のログ専用データベースでは、検索条件によってはその正規表現が複雑なものとなり、記述が困難であるという課題がある。例えば、ログの中から「２００６／７／１〜２００６／１０／１５」の範囲に含まれる日付を検索するための正規表現は、
“［＾０−９］（２００６／（［７−８］／（［１−９］｜［１−２］［０−９］｜３［０−１］）｜９／（［１−９］｜［１−２］［０−９］｜３０）｜１０／（［１−９］｜１［０−５］））［＾０−９］”
などと記述することができる。このような正規表現は、正規表現の知識の乏しい者には記述が困難であると同時に、正規表現を熟知している者にとっても正確に記述するためには試行錯誤を要するものである。
【００１３】
同様に、ログの書式を意識した検索条件によっても、その正規表現の記述が困難なものがある。そのようなものの例として、ＣＳＶ（Ｃｏｍｍａ・Ｓｅｐａｒａｔｅｄ・Ｖａｌｕｅｓ）形式のログに対して、カンマ「，」で区切られた特定のフィールドを対象とした検索を行う場合の検索条件がある。例えば、「行の先頭から３番目と４番目のカンマに囲まれたフィールドに『ファイル』という文字列が含まれる」という検索条件は、
“（＾｜￥ｎ）（［＾，］＊，）｛３｝［＾，］＊ファイル”
のように記述することができる。一口にＣＳＶ形式といっても、フィールドがさらにダブルクォーテーション「”」で囲まれているものもあるなど、様々なパターンを網羅しようとすると正規表現がさらに複雑になり、検索条件の記述が困難となる。また、特定のフィールドに上記のような特定の範囲に含まれる日付を検索するための正規表現も複雑なものとなる。
【００１４】
正規表現を利用したテキストの検索は、ＵＮＩＸ（登録商標）系ＯＳ（オペレーティングシステム）のｇｒｅｐコマンドや、スクリプト言語Ｐｅｒｌを始めとして広く利用されている。上記のような課題は、ログの検索に限定して存在する課題ではなく、これらの正規表現を利用した検索を行う処理系に共通して存在するものである。また、従来技術のように、キーワードを異なった表記でも類似した表記でも検索可能なように正規表現に変換する方式にも依然として存在する課題である。
【００１５】
本発明は、一定の範囲の属性値を検索するための正規表現を効率的に生成することを目的とする。
【課題を解決するための手段】
【００１６】
本発明の一の態様に係る正規表現生成装置は、
属性値の下限値と上限値と書式とを示す属性範囲条件データを入力装置から入力する属性範囲条件入力部と、
前記属性範囲条件入力部により入力された属性範囲条件データが示す書式に基づいて、前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値以上の属性値であって、最下位桁から少なくとも１桁が当該桁の最大値である第１の値と、前記属性範囲条件入力部により入力された属性範囲条件データが示す上限値以下の属性値であって、最下位桁から少なくとも１桁が当該桁の最小値である第２の値とを、処理装置で演算する演算部と、
前記属性範囲条件入力部により入力された属性範囲条件データが示す下限値と上限値と、前記演算部により演算された第１の値と第２の値とを、記憶装置に記憶する属性値記憶部と、
前記属性値記憶部により記憶された下限値から第１の値までの属性値を正規表現で表す下位領域データと、前記属性値記憶部により記憶された第２の値から上限値までの属性値を正規表現で表す上位領域データとを、処理装置で生成するとともに、前記属性値記憶部により記憶された第１の値と第２の値との間に属性値が存在する場合には当該属性値を正規表現で表す中位領域データを処理装置で生成する正規表現生成部と、
前記正規表現生成部により生成された下位領域データと上位領域データと中位領域データとを処理装置で結合して、前記属性値記憶部により記憶された下限値から上限値までの属性値を正規表現で表す正規表現データを生成する正規表現結合部とを備えることを特徴とする。
【発明の効果】
【００１７】
本発明の一の態様によれば、正規表現生成装置において、演算部が属性値の書式に基づいて、下限値以上の属性値であって最下位桁から少なくとも１桁が当該桁の最大値である第１の値と上限値以下の属性値であって最下位桁から少なくとも１桁が当該桁の最小値である第２の値とを演算し、正規表現生成部が下限値から第１の値までの属性値を正規表現で表す下位領域データと第２の値から上限値までの属性値を正規表現で表す上位領域データとを生成するとともに、第１の値と第２の値との間に属性値が存在する場合には当該属性値を正規表現で表す中位領域データを生成し、正規表現結合部が下位領域データと上位領域データと中位領域データとを結合することにより、一定の範囲の属性値を検索するための正規表現を効率的に生成することが可能となる。
【発明を実施するための最良の形態】
【００１８】
以下、本発明の実施の形態について、図を用いて説明する。
【００１９】
以下では、正規表現として、特に明示していない限り、一般的に普及しているものを想定して説明する。一般的な正規表現においては、例えば、
（１）＜通常の文字＞は、通常の文字を照合する。
（２）￥＜特殊文字＞は、特殊文字（「｜」、「？」、「＊」、「＋」「￥」、「＾」など）を照合する。
（３）［ａｂｃ．．．］は、文字ａｂｃ．．．中の任意の１文字を照合する。
（４）［ａ−ｚ］は、文字コードがａからｚまでの範囲にある任意の１文字を照合する。
（５）［＾ａｂｃ．．．］は、文字ａｂｃ．．．以外の任意の１文字を照合する。
（６）［＾ａ−ｚ］は、文字コードがａからｚまでの範囲にはない任意の１文字を照合する。
（７）＾は、行の先頭を照合する。
（８）＄は、行の末尾を照合する。
（９）＜正規表現＞？は、＜正規表現＞が０回又は１回現れるものを照合する。
（１０）＜正規表現＞＊は、＜正規表現＞が０回又は任意の回数繰り返されるものを照合する。
（１１）＜正規表現＞＋は、＜正規表現＞が１回以上繰り返されるものを照合する。
（１２）＜正規表現＞｛ｎ｝は、＜正規表現＞がｎ回繰り返されるものを照合する。
（１３）＜正規表現＞｛ｎ，｝は、＜正規表現＞がｎ回以上繰り返されるものを照合する。
（１４）＜正規表現＞｛，ｍ｝は、＜正規表現＞が０回以上ｍ回以下繰り返されるものを照合する。
（１５）＜正規表現＞｛ｎ，ｍ｝は、＜正規表現＞がｎ回以上ｍ回以下繰り返されるものを照合する。
（１６）＜正規表現１＞｜＜正規表現２＞は、＜正規表現１＞又は＜正規表現２＞を照合する。
（１７）＜正規表現１＞＜正規表現２＞は、前半部分が＜正規表現１＞で後半部分が＜正規表現２＞であるものを照合する。
【００２０】
以下では、原則として、正規表現はダブルクォーテーションで囲って“＜正規表現＞”という形式で示すものとする。
【００２１】
実施の形態１．
図１は、本実施の形態に係る正規表現生成装置１００の構成を示すブロック図である。
【００２２】
図１において、正規表現生成装置１００は、属性範囲条件入力部１０１、演算部１０２、属性値記憶部１０３、正規表現生成部１０４、正規表現結合部１０５、出力部１０６を備える。また、正規表現生成装置１００は、記憶装置１５１、処理装置１５２、入力装置１５３、出力装置１５４などのハードウェア装置を備える（又はこれらのハードウェア装置が正規表現生成装置１００に接続される）。ハードウェア装置は正規表現生成装置１００の各部によって利用される。例えば、処理装置１５２は、正規表現生成装置１００の各部でデータや情報の演算、加工、読み取り、書き込みなどを行うために利用される。記憶装置１５１は、そのデータや情報を記憶するために利用される。また、入力装置１５３は、そのデータや情報を入力するために、出力装置１５４は、そのデータや情報を出力するために利用される。
【００２３】
属性範囲条件入力部１０１は、属性範囲条件データを入力装置１５３から入力する。属性範囲条件データは、属性値の下限値と上限値と書式とを示す属性範囲条件のデータである。例えば、属性値を１２３〜７６５４の範囲の整数値とした場合、下限値は１２３、上限値は７６５４、書式は３〜４桁（最大４桁）の整数値型となる。この例では、属性範囲条件入力部１０１は、属性値の書式として、属性値が数値であることを示す属性範囲条件データを入力することとなるが、例えば、属性値が文字列であれば、属性範囲条件入力部１０１は、属性値の書式として、属性値が文字列であることを示す属性範囲条件データを入力することとなる。
【００２４】
演算部１０２は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す書式に基づいて、第１の値と第２の値とを処理装置１５２で演算する。第１の値は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す下限値以上の属性値であって、最下位桁から少なくとも１桁が当該桁の最大値である属性値である。上記の例のように、下限値を１２３とした場合、第１の値は１２９、１９９、９９９、６９９９、７５９９、７６４９などとなる。一方、第２の値は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す上限値以下の属性値であって、最下位桁から少なくとも１桁が当該桁の最小値である属性値である。上記の例のように、上限値を７６５４とした場合、第２の値は１３０、２００、１０００、７０００、７６００、７６５０などとなる。
【００２５】
特に本実施の形態では、演算部１０２は、第１の値として、属性範囲条件入力部１０１により入力された属性範囲条件データが示す下限値と桁数が同じで少なくとも最上位桁以外の桁が各桁の最大値である属性値を演算する。上記の例のように、下限値を１２３とした場合、第１の値は１９９、９９９などとなる。また、演算部１０２は、第２の値として、属性範囲条件入力部１０１により入力された属性範囲条件データが示す上限値と桁数が同じで少なくとも最上位桁以外の桁が各桁の最小値である属性値を演算する。上記の例のように、上限値を７６５４とした場合、第２の値は１０００、７０００などとなる。
【００２６】
さらに本実施の形態では、演算部１０２は、第１の値として、属性範囲条件入力部１０１により入力された属性範囲条件データが示す下限値と最上位桁が同じ値でそれ以外の桁が各桁の最大値である属性値を演算する。上記の例のように、下限値を１２３とした場合、第１の値は１９９となる。また、演算部１０２は、第２の値として、属性範囲条件入力部１０１により入力された属性範囲条件データが示す上限値と最上位桁が同じ値でそれ以外の桁が各桁の最小値である属性値を演算する。上記の例のように、上限値を７６５４とした場合、第２の値は７０００となる。
【００２７】
属性値記憶部１０３は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す下限値と上限値と、演算部１０２により演算された第１の値と第２の値とを、記憶装置１５１に記憶する。
【００２８】
正規表現生成部１０４は、属性値記憶部１０３により記憶された下限値から第１の値までの属性値を正規表現で表す下位領域データ（以下、単に「正規表現」、又は「下位領域の正規表現」などという場合がある）と、属性値記憶部１０３により記憶された第２の値から上限値までの属性値を正規表現で表す上位領域データ（以下、単に「正規表現」、又は「上位領域の正規表現」などという場合がある）とを、処理装置１５２で生成する。上記の例のように、下限値が１２３、上限値が７６５４、第１の値が１９９、第２の値が７０００となる場合、下位領域データは、
“１２［３−９］｜１［３−９］［０−９］”（１２３〜１９９の正規表現）、
上位領域データは、
“７［０−５］［０−９］［０−９］｜７６［０−４］［０−９］｜７６５［０−４］”（７０００〜７６５４の正規表現）
などとなる。また、正規表現生成部１０４は、属性値記憶部１０３により記憶された第１の値と第２の値との間に属性値が存在する場合には、当該属性値を正規表現で表す中位領域データ（以下、単に「正規表現」、又は「中位領域の正規表現」などという場合がある）を処理装置１５２で生成する。上記の例のように、第１の値が１９９、第２の値が７０００となる場合、中位領域データは、
“［２−９］［０−９］［０−９］｜［１−６］［０−９］［０−９］［０−９］”（２００〜６９９９の正規表現）
などとなる。
【００２９】
正規表現結合部１０５は、正規表現生成部１０４により生成された下位領域データと上位領域データと中位領域データとを処理装置１５２で結合して、属性値記憶部１０３により記憶された下限値から上限値までの属性値を正規表現で表す正規表現データ（以下、単に「正規表現」、又は「属性値の正規表現」という場合がある）を生成する。上記の例のように、下位領域データが“１２［３−９］｜１［３−９］［０−９］”、上位領域データが“７［０−５］［０−９］［０−９］｜７６［０−４］［０−９］｜７６５［０−４］”、中位領域データが“［２−９］［０−９］［０−９］｜［１−６］［０−９］［０−９］［０−９］”となる場合、正規表現データは、
“（１２［３−９］｜１［３−９］［０−９］）｜（［２−９］［０−９］［０−９］｜［１−６］［０−９］［０−９］［０−９］）｜（７［０−５］［０−９］［０−９］｜７６［０−４］［０−９］｜７６５［０−４］）”
などとなる。
【００３０】
出力部１０６は、正規表現結合部１０５により生成された正規表現データを出力装置１５４に出力する。
【００３１】
このように、本実施の形態において、正規表現生成装置１００は、検索条件として属性値の値域に含まれる値の下限値と上限値とを指定する属性範囲条件を入力とし、これを、属性範囲条件に指定された範囲に含まれる属性値を表現する文字列を照合するための正規表現に変換する検索条件生成方式、又は、この方式を計算機上で実行するための検索条件生成プログラムを実装するものである。
【００３２】
上記検索条件生成方式では、例えば、数値の範囲を選択する属性範囲条件を正規表現に変換する。また、例えば、文字列の範囲を選択する属性範囲条件を正規表現に変換する。
【００３３】
上記検索条件生成方式では、例えば、属性の下限値、上限値、属性の書式（属性のデータ型を含む）からなる属性範囲条件を、
属性範囲条件＝（０，２５５，％３ｄ）
と表記して入力する。ここでは、一例として、
属性の下限値＝０
属性の上限値＝２５５
属性の書式（桁数とデータ型）＝「（最大）３桁の整数値」
としている。この例では、属性の書式を表すのに、Ｃ言語におけるｐｒｉｎｔｆなどの書式付き出力関数の書式指定の表記法を流用しているが、同等の条件を指定することが可能であれば、同じ表記法である必要はない。また、同様の条件を入力することができるのであれば、その入力方法は問わない。
【００３４】
上記の属性範囲条件を入力した場合、正規表現生成装置１００により、その下限値から上限値までの範囲に含まれる属性値を表現する文字列を照合するための正規表現が、
正規表現＝“［＾０−９］（［０−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜２［０−４］［０−９］｜２５［０−５］）［＾０−９］”
などとして出力される。なお、上記の属性範囲条件を構成する項目のうち、全てが揃っている必要はない。例えば、下限値がなければ、下限値を属性値のとりうる値の最小値として扱ってもよい（上記の例では、下限値＝０となる）。また、例えば、上限値がなければ、上限値を属性値のとりうる値の最大値として扱ってもよい（上記の例では、上限値＝∞となる）。また、例えば、属性の書式が整数値であることが示されていなければ、属性のデータ型が文字列であると推定してもよいし、下限値と上限値が整数値であることから属性のデータ型が整数値であると推定してもよい。
【００３５】
上記検索条件生成方式は、以下でも述べるように、例えば、ＰＣ（パーソナルコンピュータ）やＰＣサーバなどの計算機上で動作するプログラムとして実現してもよいし、本方式を実装した機能部を備えたハードウェアとして実装してもよい。
【００３６】
図２は、正規表現生成装置１００の外観の一例を示す図である。
【００３７】
図２において、正規表現生成装置１００は、システムユニット９１０、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）やＬＣＤ（液晶ディスプレイ）の表示画面を有する表示装置９０１、キーボード９０２（Ｋ／Ｂ）、マウス９０３、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ・Ｄｉｓｋ・Ｄｒｉｖｅ）、ＣＤＤ９０５（Ｃｏｍｐａｃｔ・Ｄｉｓｃ・Ｄｒｉｖｅ）、プリンタ装置９０６などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。システムユニット９１０は、コンピュータであり、ＬＡＮ９４２（ローカルエリアネットワーク）、ゲートウェイ９４１を介してインターネット９４０に接続されている。
【００３８】
図３は、正規表現生成装置１００のハードウェア資源の一例を示す図である。
【００３９】
図３において、正規表現生成装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ・Ｐｒｏｃｅｓｓｉｎｇ・Ｕｎｉｔ）（「演算装置」、「マイクロプロセッサ」、「マイクロコンピュータ」、「プロセッサ」ともいう）を備えている。ＣＰＵ９１１は、処理装置１５２の一例である。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３（Ｒｅａｄ・Ｏｎｌｙ・Ｍｅｍｏｒｙ）、ＲＡＭ９１４（Ｒａｎｄｏｍ・Ａｃｃｅｓｓ・Ｍｅｍｏｒｙ）、通信ボード９１５、表示装置９０１、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５、プリンタ装置９０６、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカードリーダライタなどの記憶媒体が用いられてもよい。
【００４０】
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置１５１の一例である。通信ボード９１５、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５などは、入力装置１５３の一例である。また、通信ボード９１５、表示装置９０１、プリンタ装置９０６などは、出力装置１５４の一例である。
【００４１】
通信ボード９１５は、ＬＡＮ９４２などに接続されている。通信ボード９１５は、ＬＡＮ９４２に限らず、インターネット９４０、あるいは、ＩＰ−ＶＰＮ（Ｉｎｔｅｒｎｅｔ・Ｐｒｏｔｏｃｏｌ・Ｖｉｒｔｕａｌ・Ｐｒｉｖａｔｅ・Ｎｅｔｗｏｒｋ）、広域ＬＡＮ、ＡＴＭ（Ａｓｙｎｃｈｒｏｎｏｕｓ・Ｔｒａｎｓｆｅｒ・Ｍｏｄｅ）ネットワークなどのＷＡＮ（ワイドエリアネットワーク）などに接続されていても構わない。インターネット９４０あるいはＷＡＮなどに接続されている場合、ゲートウェイ９４１は不要となる。
【００４２】
磁気ディスク装置９２０には、オペレーティングシステム９２１、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。プログラム群９２３には、本実施の形態の説明において「〜部」、「〜手段」として説明する機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。また、ファイル群９２４には、本実施の形態の説明において、「〜データ」、「〜情報」、「〜ＩＤ（ＩＤｅｎｔｉｆｉｅｒ）」、「〜フラグ」、「〜結果」として説明するデータや情報や信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」や「〜テーブル」の各項目として記憶されている。「〜ファイル」や「〜データベース」や「〜テーブル」は、ディスクやメモリなどの記憶媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶されたデータや情報や信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・制御・出力・印刷・表示などのＣＰＵ９１１の処理（動作）に用いられる。抽出・検索・参照・比較・演算・計算・制御・出力・印刷・表示などのＣＰＵ９１１の処理中、データや情報や信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【００４３】
また、本実施の形態の説明において説明するブロック図やフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号は、ＲＡＭ９１４などのメモリ、ＦＤＤ９０４のフレキシブルディスク（ＦＤ）、ＣＤＤ９０５のコンパクトディスク（ＣＤ）、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク（ＭＤ）、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｃ）などの記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体により伝送される。
【００４４】
また、本実施の形態の説明において「〜部」、「〜手段」として説明するものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜工程」、「〜手順」、「〜処理」であってもよい。即ち、「〜部」、「〜手段」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。あるいは、ソフトウェアのみ、あるいは、素子・デバイス・基板・配線などのハードウェアのみ、あるいは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実現されていても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤなどの記録媒体に記憶される。このプログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。即ち、プログラムは、本実施の形態の説明で述べる「〜部」、「〜手段」としてコンピュータを機能させるものである。あるいは、本実施の形態の説明で述べる「〜部」、「〜手段」の手順や方法をコンピュータに実行させるものである。
【００４５】
以下では、説明をより具体的にするため、正規表現生成装置１００が図２、図３に例示したコンピュータとハードウェア資源により実現されているものとする。
【００４６】
図４は、本実施の形態に係る正規表現生成方法を示すフローチャートである。図４のフローチャートに示すフローは、正規表現生成装置１００を実現するコンピュータ上で実行されるプログラム（正規表現生成プログラム）の処理手順に相当する。この処理手順において、正規表現生成プログラムは、以下に示す各処理をコンピュータに実行させる。
【００４７】
正規表現生成装置１００の利用者がキーボード９０２やマウス９０３で属性範囲条件データを指定すると、属性範囲条件入力部１０１は、その属性範囲条件データをキーボード９０２やマウス９０３から入力する（ステップＳ１０１：属性範囲条件入力処理）。
【００４８】
演算部１０２は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す書式に基づいて、第１の値と第２の値とをＣＰＵ９１１で演算する（ステップＳ１０２の一部：演算処理）。属性値記憶部１０３は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す下限値と上限値と、演算部１０２により演算された第１の値と第２の値とを、ＲＡＭ９１４に記憶する（ステップＳ１０２の一部：属性値記憶処理）。
【００４９】
ステップＳ１０２において、演算部１０２は、第１の値と第２の値とを演算することにより、属性範囲条件の下限値から上限値までの範囲に含まれる属性値を、下位、中位、上位の３領域に分割している。３領域のうち、中位領域は、その範囲に含まれる属性値を半固定的に正規表現に変換可能な値の範囲である。下位領域は、属性範囲条件の下限値（即ち、属性値の下限値）から中位領域の下限値の１つ下（即ち、第１の値）までの値の範囲のことを指す。上位領域は、中位領域の上限値の１つ上（即ち、第２の値）から属性範囲条件の上限値（即ち、属性値の上限値）までの値の範囲のことを指す。各領域の算出の方法は、後で具体例を交えて説明する。
【００５０】
正規表現生成部１０４は、属性値記憶部１０３により記憶された第１の値と第２の値との間に属性値が存在する場合には、当該属性値を正規表現で表す中位領域データをＣＰＵ９１１で生成する（ステップＳ１０３：正規表現生成処理の一部）。第１の値と第２の値との間に属性値が存在しない場合には、中位領域データは生成されない。正規表現生成部１０４は、属性値記憶部１０３により記憶された下限値から第１の値までの属性値を正規表現で表す下位領域データをＣＰＵ９１１で生成する（ステップＳ１０４：正規表現生成処理の一部）。正規表現生成部１０４は、属性値記憶部１０３により記憶された第２の値から上限値までの属性値を正規表現で表す上位領域データをＣＰＵ９１１で生成する（ステップＳ１０５：正規表現生成処理の一部）。
【００５１】
ステップＳ１０３、Ｓ１０４、Ｓ１０５において、正規表現生成部１０４は、中位、下位、上位の３領域のそれぞれについて、個別に対応する正規表現を生成している。ステップＳ１０３、Ｓ１０４、Ｓ１０５の処理は順序に依存しないため、任意の順序で実行してよい。
【００５２】
正規表現結合部１０５は、正規表現生成部１０４により生成された下位領域データと上位領域データと中位領域データとをＣＰＵ９１１で結合して（ステップＳ１０３で中位領域データが生成されなかった場合には、下位領域データと上位領域データのみを結合することになる）、属性値記憶部１０３により記憶された下限値から上限値までの属性値を正規表現で表す正規表現データを生成する（ステップＳ１０６：正規表現結合処理）。
【００５３】
出力部１０６は、正規表現結合部１０５により生成された正規表現データを表示装置９０１の画面などに出力する（ステップＳ１０７：出力処理）。正規表現生成装置１００の利用者は、この正規表現データを検索条件として、前述したログ専用データベースなどに入力することにより、ログなどの検索を容易に行うことができる。
【００５４】
以下、正規表現を生成する処理の流れを、例を交えて説明する。ここで説明するのは、属性範囲条件の下限値Ａと上限値Ｂに対して、Ａ≦Ｘ≦Ｂを満たす値Ｘ（下限値Ａから上限値Ｂまでの属性値Ｘ）を表現する文字列を照合するための正規表現を生成する処理の流れである。
【００５５】
初めにここでは属性値の下限値と上限値の桁数が等しい場合に限定して、次のように表すものとする。
下限値Ａ：ＡｎＡｎ−１．．．Ａ２Ａ１
上限値Ｂ：ＢｎＢｎ−１．．．Ｂ２Ｂ１
ここで、添え字が大きいほど上位の桁とする。
属性値を構成する属性要素Ａｉ、Ｂｉ（１≦ｉ≦ｎ）は、それぞれ１個の数字や文字で、その値域をｖ１≦Ａｉ、Ｂｉ≦ｖｑとする。ただし、最上位桁のみｖ２≦Ａｎ、Ｂｎ≦ｖｑとする。ここでは簡単のために、最上位桁を除く全ての桁の値域は同じであるとする。また、（ｖｊ）ｋで「ｋ桁目の値がｖｊ」であることを表すものとする。さらに、この属性値の大小関係は以下の基準で決定されるものとする。
Ａｎ＝Ｂｎ，Ａｎ−１＝Ｂｎ−１，．．．，Ａｋ＋１＝Ｂｋ＋１（１≦ｋ≦ｎ）のとき、Ｂｋ＞ＡｋならばＢ＞Ａ
Ａｉ＋１と記述してＡｉの値を１大きくすることとし、Ａｉ＝ｖｊの場合Ａｉ＋１＝ｖｊ＋１とする。ただし、Ａｉ＝ｖｑの場合はＡｉ＋１＝ｖ１とし、さらにＡｉ＋１＋１とする。同様に、Ａｉ−１と記述してＡｉの値を１小さくすることとし、Ａｉ＝ｖｊの場合Ａｉ−１＝ｖｊ−１とする。ただし、Ａｉ＝ｖ１の場合はＡｉ−１＝ｖｑとし、さらにＡｉ＋１−１とする。属性値Ａを１大きくすることをＡ＋１と記述し、Ａ１＋１を意味するものとする。同様に、属性値Ａを１小さくすることをＡ−１と記述し、Ａ１−１を意味するものとする。
【００５６】
このような特徴を持つ属性値として代表的なものに、整数値（絶対値）がある。
【００５７】
ここで、下限値Ａと上限値Ｂが等しい場合は、ステップＳ１０２を実行するまでもなく正規表現として以下を出力するだけでよい。
正規表現：“ＡｎＡｎ−１．．．Ａ２Ａ１”
【００５８】
以降は、下限値と上限値が等しくない場合について説明する。
【００５９】
ステップＳ１０２では、演算部１０２は、属性値を下位、中位、上位の３領域に分割するが、その中でも最初に中位領域を求める。中位領域は、図５に示した処理の流れに従って、以下のように値域を求めることができる。図５では中位領域の下限値（即ち、第１の値より１大きい値）をＬ、上限値をＵ（即ち、第２の値より１小さい値）としている。
【００６０】
図５において、演算部１０２は、最上位桁（ｎ桁目）から順番に（ステップＳ２０１）属性値の下限値Ａと上限値Ｂの同じ桁の値をＣＰＵ９１１により比較していく（ステップＳ２０２）。ある桁（ｉ桁目）について、ＡとＢとで値が同じ場合、演算部１０２は、ＬとＵの同じ桁（Ｌｉ、Ｕｉ）もその値（Ａｉ）に設定し（ステップＳ２０３）、次の桁について（ステップＳ２０４）ＡとＢを比較する。比較した桁について、ＡとＢとで値が異なる場合、演算部１０２は、Ｌの同じ桁（Ｌｉ）をＡの値より１大きい値（Ａｉ＋１）に設定するとともに、Ｕの同じ桁（Ｕｉ）をＢの値より１小さい値（Ｂｉ−１）に設定する（ステップＳ２０５）。そして、次の桁から最下位桁までの各桁について（ステップＳ２０６、Ｓ２０７）、Ｌをその桁の最小値（ｖ１）に設定するとともに、Ｕをその桁の最大値（ｖｑ）に設定する（ステップＳ２０８）。その結果、下記の通りＬとＵが得られる。このとき、属性値記憶部１０３はＬとＵをＲＡＭ９１４に記憶している。
中位領域（下限値Ｌ）：Ａｎ．．．Ａｋ＋１（Ａｋ＋１）（ｖ１）ｋ−１．．．（ｖ１）１
中位領域（上限値Ｕ）：Ｂｎ．．．Ｂｋ＋１（Ｂｋ−１）（ｖｑ）ｋ−１．．．（ｖｑ）１
ただし、Ａｎ＝Ｂｎ，Ａｎ−１＝Ｂｎ−１，．．．，Ａｋ＋１＝Ｂｋ＋１（１≦ｋ≦ｎ）
【００６１】
次に、中位領域の下限値を１小さくした値を下位領域の上限値（即ち、第１の値）とし、下位領域は以下のように求める。このとき、属性値記憶部１０３は属性値の下限値Ａと第１の値（Ｌ−１）をＲＡＭ９１４に記憶している。
下位領域（下限値Ａ）：ＡｎＡｎ−１．．．Ａ２Ａ１
下位領域（上限値）：Ａｎ．．．Ａｋ（ｖｑ）ｋ−１．．．（ｖｑ）１
【００６２】
また、中位領域の上限値を１大きくした値を上位領域の下限値（即ち、第２の値）とし、上位領域は以下のように求める。このとき、属性値記憶部１０３は第２の値（Ｕ＋１）と属性値の上限値ＢをＲＡＭ９１４に記憶している。
上位領域（下限値）：Ｂｎ．．．Ｂｋ（ｖ１）ｋ−１．．．（ｖ１）１
上位領域（上限値Ｂ）：ＢｎＢｎ−１．．．Ｂ２Ｂ１
【００６３】
ステップＳ１０３において、正規表現生成部１０４は、中位領域の正規表現を生成する。中位領域に対応する正規表現は、中位領域の非共通部分の桁数ｋとＡｋ、Ｂｋの値にのみ依存し、以下の通り生成することができる。ｋ＋１桁目からｎ桁目までの値は、ステップＳ１０６において、共通部分として処理できるため、ここでは省略している。
中位領域の正規表現：“［（Ａｋ＋１）−（Ｂｋ−１）］［ｖ１−ｖｑ］｛ｋ−１｝”
ここで、Ｂｋ−Ａｋ＝１の場合、（Ａｋ＋１）＞（Ｂｋ−１）となるが、この場合は中位領域の正規表現を出力しないものとする。それ以外は同様に処理することができる。
【００６４】
なお、上記正規表現において、ｋ−１＝１であれば末尾の“｛１｝”を省略してもよい。また、ｋ−１＝０であれば末尾の“［ｖ１−ｖｑ］｛０｝”を省略してもよい。以降の説明においても、正規表現中の“［ｖｉ−ｖｊ］｛１｝”は“［ｖｉ−ｖｊ］”と記述できるものとし、“［ｖｉ−ｖｊ］｛０｝”は省略できるものとする。また、“［ｖｉ−ｖｉ］”は単に“ｖｉ”と記述できるものとする。
【００６５】
図６は、以下のような属性値の範囲に対応する正規表現の生成処理の流れを示す。
下限値：ＡｋＡｋ−１．．．Ａ１
上限値：（ｖｊ）ｋ（ｖｑ）ｋ−１．．．（ｖｑ）１（ただし、ｖｊ≧Ａｋ）
【００６６】
図６の処理の流れでは、正規表現生成部１０４は、最下位の桁から上位の桁に向かって処理を進めている。ここでの入力は、下限値Ａｋ．．．Ａ１、上限値（ｖｊ）ｋ（ｖｑ）ｋ−１．．．（ｖｑ）１、及び桁数ｋである。ステップＳ３０１において、正規表現生成部１０４は、ＲＡＭ９１４内の正規表現の格納領域（Ｅ）に初期値として“Ａｋ．．．Ａ２［Ａ１−ｖｑ］”をセットする。ステップＳ３０２以降では、下位２桁目から始めてｋ−１桁目までステップＳ３０４〜Ｓ３０６の処理を繰り返す。ステップＳ３０３において、処理の対象がｋ桁目より下位の場合（ＹＥＳ）、ステップＳ３０４において、その桁の値がｖｑか否かによって処理を切り分ける。ｖｑの場合には（ＹＥＳ）、正規表現生成部１０４は特に何も出力せずに次の桁の処理に移行する。ｖｑではない場合には（ＮＯ）、正規表現生成部１０４は、正規表現の出力領域（Ｅ）の末尾に“｜Ａｋ．．．Ａｉ＋１［（Ａｉ＋１）−ｖｑ］［ｖ１−ｖｑ］｛ｉ−１｝”を追加し、次の桁の処理に移行する。ステップＳ３０３において、ｋ−１桁目までの処理が完了していた場合は（ＮＯ）、ステップＳ３０７に進む。ステップＳ３０７において、Ａｋとｖｊが等しい場合は（ＹＥＳ）、正規表現生成部１０４は何もせずに処理を終了する。Ａｋとｖｊが等しくない場合は（ＮＯ）、正規表現生成部１０４はステップＳ３０８に進み、正規表現格納領域（Ｅ）の末尾に“｜［（Ａｋ＋１）−ｖｊ］［ｖ１−ｖｑ］｛ｋ−１｝”を追加し、処理を終了する。処理が終了した時点で正規表現の格納領域（Ｅ）に格納されているものが、上記の範囲に対応する正規表現である。
【００６７】
ステップＳ１０４における下位領域の正規表現生成処理の流れは、図６においてＡｎ＝Ｂｎ，．．．，Ａｋ＋１＝Ｂｋ＋１（１≦ｋ≦ｎ）を満たすｋに対して下限値と上限値を以下のようにした場合に相当する。
下限値：ＡｋＡｋ−１．．．Ａ１
上限値：Ａｋ（ｖｑ）ｋ−１．．．（ｖｑ）１
そして、ステップＳ１０４において、正規表現生成部１０４が生成する下位領域の正規表現は以下の通りとなる。ｋ＋１桁目からｎ桁目までの値は、ステップＳ１０６において、共通部分として処理できるため、ここでも省略している。
下位領域の正規表現：“Ａｋ．．．Ａ２［Ａ１−ｖｑ］｜Ａｋ．．．Ａ３［（Ａ２＋１）−ｖｑ］［ｖ１−ｖｑ］｜．．．｜Ａｋ［（Ａｋ−１＋１）−ｖｑ］［ｖ１−ｖｑ］｛ｋ−２｝”
【００６８】
図７は、以下のような属性値の範囲に対応する正規表現の生成処理の流れを示す。
下限値：（ｖｊ）ｋ（ｖ１）ｋ−１．．．（ｖ１）１（ただし、ｖｊ≦Ｂｋ）
上限値：ＢｋＢｋ−１．．．Ｂ１
【００６９】
図７の処理の流れでは、正規表現生成部１０４は、図６の処理の流れ同様に、最下位の桁から上位の桁に向かって処理を進めている。ここでの入力は、下限値（ｖｊ）ｋ（ｖ１）ｋ−１．．．（ｖ１）１、上限値Ｂｋ．．．Ｂ１、及び桁数ｋである。ステップＳ４０１において、正規表現生成部１０４は、ＲＡＭ９１４内の正規表現の格納領域（Ｅ）に初期値として“Ｂｋ．．．Ｂ２［ｖ１−Ｂ１］”をセットする。ステップＳ４０２以降では、下位２桁目から始めてｋ−１桁目までステップＳ４０４〜Ｓ４０６の処理を繰り返す。ステップＳ４０３において、処理の対象がｋ桁目より下位の場合（ＹＥＳ）、ステップＳ４０４において、その桁の値がｖ１か否かによって処理を切り分ける。ｖ１の場合には（ＹＥＳ）、正規表現生成部１０４は特に何も出力せずに次の桁の処理に移行する。ｖ１ではない場合には（ＮＯ）、正規表現生成部１０４は、正規表現の出力領域（Ｅ）の末尾に“｜Ｂｋ．．．Ｂｉ＋１［ｖ１−（Ｂｉ−１）］［ｖ１−ｖｑ］｛ｉ−１｝”を追加し、次の桁の処理に移行する。ステップＳ４０３において、ｋ−１桁目までの処理が完了していた場合は（ＮＯ）、ステップＳ４０７に進む。ステップＳ４０７において、Ｂｋとｖｊが等しい場合は（ＹＥＳ）、正規表現生成部１０４は何もせずに処理を終了する。Ｂｋとｖｊが等しくない場合は（ＮＯ）、正規表現生成部１０４はステップＳ４０８に進み、正規表現格納領域（Ｅ）の末尾に“｜［ｖｊ−（Ｂｋ−１）］［ｖ１−ｖｑ］｛ｋ−１｝”を追加し、処理を終了する。処理が終了した時点で正規表現の格納領域（Ｅ）に格納されているものが、上記の範囲に対応する正規表現である。
【００７０】
ステップＳ１０５における上位領域の正規表現生成処理の流れは、図７においてＡｎ＝Ｂｎ，．．．，Ａｋ＋１＝Ｂｋ＋１（１≦ｋ≦ｎ）を満たすｋに対して下限値と上限値を以下のようにした場合に相当する。
下限値：Ｂｋ（ｖ１）ｋ−１．．．（ｖ１）１
上限値：ＢｋＢｋ−１．．．Ｂ１
そして、ステップＳ１０５において、正規表現生成部１０４が生成する上位領域の正規表現は以下の通りとなる。ｋ＋１桁目からｎ桁目までの値は、ステップＳ１０６において、共通部分として処理できるため、ここでも省略している。
上位領域の正規表現：“Ｂｋ．．．Ｂ２［ｖ１−Ｂ１］｜Ｂｋ．．．Ｂ３［ｖ１−（Ｂ２−１）］［ｖ１−ｖｑ］｜．．．｜Ｂｋ［ｖ１−（Ｂｋ−１−１）］［ｖ１−ｖｑ］｛ｋ−２｝”
【００７１】
以上、属性値の範囲を下位、中位、上位領域に分割し、個別に対応する正規表現を生成する処理について説明した。次に、ステップＳ１０６において、正規表現結合部１０５が、それらの生成された正規表現を結合して生成する正規表現について説明する。
【００７２】
正規表現結合部１０５は、下位、中位、上位領域の正規表現を結合し、結合した正規表現に、ステップＳ１０３〜Ｓ１０５において省略されていた共通部分（ｋ＋１桁目からｎ桁目まで）を追加する。これにより最終的に生成される正規表現は以下のような形式となる。
“Ａｎ．．．Ａｋ＋１（＜下位領域の正規表現＞｜＜中位領域の正規表現＞｜＜上位領域の正規表現＞）”
また、中位領域がない場合に生成される正規表現は以下のような形式となる。
“Ａｎ．．．Ａｋ＋１（＜下位領域の正規表現＞｜＜上位領域の正規表現＞）”
【００７３】
上記の正規表現では、Ａ≦Ｘ≦Ｂを満たす値Ｘだけでなく、値ｖｉＸ、Ｘｖｊ、ｖｉＸｖｊを表す文字列などもヒットしてしまう。そこで、このようなヒットを避けたい場合には、生成した正規表現の前後に除外文字指定“［＾ｖ１−ｖｑ］”を追加するとよい。
【００７４】
以下、属性範囲条件の上限値と下限値の桁数が異なる場合について説明する。即ち、以下のような場合である。
下限値Ａ：ＡｎＡｎ−１．．．Ａ２Ａ１
上限値Ｂ：ＢｍＢｍ−１．．．Ｂ２Ｂ１（ｍ＞ｎ）
属性値の桁数が異なるとき、ｍ＞ｎならばＢ＞Ａである。又は、下限値Ａのｎ＋１桁目からｍ桁目までは、暗黙の値としてｖ１があるものと考えることもできる。
【００７５】
まず、ｍ−ｎ＝１の場合は、以下のように下位、中位、上位領域を求めることができる。
下位領域：ＡｎＡｎ−１．．．Ａ２Ａ１〜（ｖｑ）ｎ（ｖｑ）ｎ−１．．．（ｖｑ）２（ｖｑ）１
中位領域：なし
上位領域：（ｖ１）ｍ（ｖ１）ｍ−１．．．（ｖ１）２（ｖ１）１〜ＢｍＢｍ−１．．．Ｂ２Ｂ１
以降の処理の流れについては、図４、図６、図７に示した処理の流れと同じである。
【００７６】
もしくは、ｍ−ｎ＝１の場合も、図５の処理の流れに従って、以下のように中位領域を求めてもよい。
中位領域：（Ａｎ＋１）（ｖ１）ｎ−１．．．（ｖ１）２（ｖ１）１〜（Ｂｍ−１）（ｖｑ）ｍ−１．．．（ｖｑ）２（ｖｑ）１
このとき、下位領域と上位領域は以下のようになる。
下位領域：ＡｎＡｎ−１．．．Ａ２Ａ１〜Ａｎ（ｖｑ）ｎ−１．．．（ｖｑ）２（ｖｑ）１
上位領域：Ｂｍ（ｖ１）ｍ−１．．．（ｖ１）２（ｖ１）１〜ＢｍＢｍ−１．．．Ｂ２Ｂ１
そして、中位領域の正規表現は以下のようになる。
中位領域の正規表現：“［（Ａｎ＋１）−ｖｑ］［ｖ１−ｖｑ］｛ｎ−１｝｜［ｖ２−（Ｂｍ−１）］［ｖ１−ｖｑ］｛ｍ−１｝”
【００７７】
また、ｍ−ｎ＞２の場合は、下位、中位、上位領域を以下のようにして同様に処理することができる。
下位領域：ＡｎＡｎ−１．．．Ａ２Ａ１〜（ｖｑ）ｎ（ｖｑ）ｎ−１．．．（ｖｑ）２（ｖｑ）１
中位領域：（ｖ２）ｎ＋１（ｖ１）ｎ．．．（ｖ１）２（ｖ１）１〜（ｖｑ）ｍ−１（ｖｑ）ｍ−２．．．（ｖｑ）２（ｖｑ）１
上位領域：（ｖ２）ｍ（ｖ１）ｍ−１．．．（ｖ１）２（ｖ１）１〜ＢｍＢｍ−１．．．Ｂ２Ｂ１
そして、中位領域の正規表現は以下のようになる。
中位領域の正規表現：“［ｖ２−ｖｑ］［ｖ１−ｖｑ］｛ｎ，ｍ−２｝”
【００７８】
上記の方式を０以上の整数値に適用した場合の具体例を示す。１０進数の場合、ｖ１＝０、ｖｑ＝９である。
【００７９】
（例１−１）属性範囲条件：１２３〜２４６
下位領域：１２３〜１９９
中位領域：２００〜１９９（正規表現は生成されない）
上位領域：２００〜２４６
正規表現：“（１２［３−９］｜１［３−９］［０−９］）｜（２４［０−６］｜２［０−３］［０−９］）”
【００８０】
（例１−２）属性範囲条件：２３４５〜７６５４
下位領域：２３４５〜２９９９
中位領域：３０００〜６９９９
上位領域：７０００〜７６５４
正規表現：“（２３４［５−９］｜２３［５−９］［０−９］｜２［４−９］［０−９］｛２｝）｜［３−６］［０−９］｛３｝｜（７６５［０−４］｜７６［０−４］［０−９］｜７［０−５］［０−９］｛２｝）”
【００８１】
（例１−３）属性範囲条件：７５３１〜１８９３９
下位領域：７５３１〜９９９９
中位領域：１００００〜１７９９９
上位領域：１８０００〜１８９３９
正規表現：“（７５３［１−９］｜７５［４−９］［０−９］）｜７［６−９］［０−９］｛２｝｜［８９］［０−９］｛３｝）｜１［０−７］［０−９］｛３｝｜（１８９３［０−９］｜１８９［０−２］［０−９］｜１８［０−８］［０−９］｛２｝）”
あるいは、
下位領域：７５３１〜７９９９
中位領域：８０００〜１７９９９
上位領域：１８０００〜１８９３９
正規表現：“（７５３［１−９］｜７５［４−９］［０−９］）｜７［６−９］［０−９］｛２｝）｜（［８−９］［０−９］｛３｝｜１［０−７］［０−９］｛３｝）｜（１８９３［０−９］｜１８９［０−２］［０−９］｜１８［０−８］［０−９］｛２｝）”
【００８２】
（例１−４）属性範囲条件：３０４〜７６５４３２
下位領域：３０４〜９９９
中位領域：１０００〜９９９９９
上位領域：１０００００〜７６５４３２
正規表現：“（３０［４−９］｜３［１−９］［０−９］｜［４−９］［０−９］｛２｝）｜［１−９］［０−９］｛３，４｝｜（７６５４３［０−２］｜７６５４［０−２］［０−９］｜７６５［０−３］［０−９］｛２｝｜７６［０−４］［０−９］｛３｝｜７［０−５］［０−９］｛４｝｜［１−６］［０−９］｛５｝）”
【００８３】
数値の場合、数値の前に０の連続が許容される場合がある。属性範囲条件にて、「数値の先頭部分に任意の数の０の連続がある」という書式指定がなされた場合には、図４のステップＳ１０７において、正規表現結合部１０５は、正規表現を以下のように生成する。
正規表現：“［＾１−９］０＊（＜下位領域の正規表現＞｜＜中位領域の正規表現＞｜＜上位領域の正規表現＞）［＾０−９］”
【００８４】
また、属性範囲条件にて、「全体の桁数をｔとし、不足する場合は先頭に０を補う」という書式指定（Ｃ言語のｐｒｉｎｔｆ関数の書式指定で記述するところの”％０ｔｄ”）がなされた場合には、正規表現結合部１０５は、以下のように正規表現を生成することができる。
正規表現：“［＾１−９］０｛ｔ−ｍ，０｝（０｛ｍ−ｎ｝＜下位領域の正規表現＞｜＜中位領域の正規表現＞｜＜上位領域の正規表現＞）［＾０−９］”
ここで、中位領域の正規表現は以下のようになる。
中位領域の正規表現：“０｛ｔ−ｎ−１｝［１−９］［０−９］｛ｎ｝｜０｛ｔ−ｎ−２｝［１−９］［０−９］｛ｎ＋１｝｜．．．｜０｛ｔ−ｍ−１｝［１−９］［０−９］｛ｍ｝”
【００８５】
負の整数の場合は、正規表現生成部１０４が、まず絶対値に対して同様に正規表現を生成した後で、正規表現の先頭に負号を加えることで生成できる。また、属性値の範囲が０をまたがるような場合には、正（０以上）の領域と、負（０未満）の領域とに分けて処理を行えばよい。例えば、
下限値Ａ：−ＡｎＡｎ−１．．．Ａ２Ａ１
上限値Ｂ：ＢｍＢｍ−１．．．Ｂ２Ｂ１
という属性範囲条件が与えられた場合は、
正の下限値：０
正の上限値：ＢｍＢｍ−１．．．Ｂ２Ｂ１
及び、
負の下限値：−ＡｎＡｎ−１．．．Ａ２Ａ１
負の上限値：−１
として個別に正規表現を生成し、正規表現結合部１０５が最後に以下のように結合すればよい。
正規表現：“＜０〜Ｂの範囲の正規表現＞｜（−＜１〜Ａの絶対値の範囲の正規表現＞）”
【００８６】
これまでの説明では、属性値の下限値Ａ、上限値Ｂともに指定されている場合について示してきた。ここでは、上限値Ｂの指定がない場合や上限値が「無限大」と指定された場合について説明する。属性のデータ型として最大値Ｂ´が存在する場合は、正規表現結合部１０５は下限値Ａから上限値Ｂ´までの正規表現を生成すればよい。属性のデータ型として最大値がない場合には、以下のように処理するとよい。
【００８７】
まず、正規表現結合部１０５は、下限値Ａと同じ桁数の属性値の最大値について正規表現を生成する。即ち、以下のようなｎ桁の下限値と上限値について正規表現を生成する。
下限値Ａ：Ａｎ．．．Ａ１
上限値Ｂ´：（ｖｑ）ｎ．．．（ｖｑ）１
その上で、正規表現結合部１０５は、ｎ桁目より上位の属性値の正規表現“［ｖ２−ｖｑ］［ｖ１−ｖｑ］｛ｎ，｝”を追加する。生成される正規表現は以下の形式になる。
正規表現：“＜Ａ〜Ｂ´の範囲の正規表現＞｜［ｖ２−ｖｑ］［ｖ１−ｖｑ］｛ｎ，｝”
【００８８】
下限値Ａの指定がない場合や下限値が「無限小」と指定された場合について説明する。まず、属性のデータ型として最小値Ａ´があるならば、正規表現結合部１０５は下限値Ａ´と上限値Ｂについて正規表現を生成するようにすればよい。例えば、検索対象の属性のデータ型が正の整数であれば最小値は１であるし、自然数であれば最小値は０である。負の整数値も含む場合は、正規表現結合部１０５は、これまでに示してきた手順に従って以下のような正規表現を生成すればよい。即ち、０〜Ｂの数値範囲と、１桁以上の負の数値として考える。なお、以下の正規表現の記述例では、０回以上の繰り返しを“｛０，｝”の代わりに“＊”で表している。
正規表現：“＜０〜Ｂの範囲の正規表現＞｜（−［１−９］［０−９］＊）”
【００８９】
数字に全角と半角数字が、アルファベット（英字）に大文字と小文字があるように、属性の各桁の値域が２種類以上存在する場合がある（ｖ１≦Ａｉ≦ｖｑ，ｗ１≦Ａｉ≦ｗｑ，．．．）。その場合でも、正規表現結合部１０５が、上で示した処理の流れを少し修正するだけで、対応する正規表現を生成することができる。即ち、２種類以上の属性値の記述を区別しないという指定がなされた場合には、選択「｜」や文字クラスを使用して並べて記述することで生成することができる。例を示す。
（１）選択を使用する場合
修正前：“ｖｉｖｊ［ｖｋ−ｖｌ］”
修正後：“（ｖｉｖｊ［ｖｋ−ｖｌ］｜ｗｉｗｊ［ｗｋ−ｗｌ］｜．．．）”
（２）文字クラスを使用する場合
修正前：“ｖｉｖｊ［ｖｋ−ｖｌ］”
修正後：“［ｖｉｗｉ．．．］［ｖｊｗｊ．．．］［ｖｋ−ｖｌｗｋ−ｗｌ．．．］”
【００９０】
数値の場合には、下位の桁から３桁ごとにカンマ「，」で区切られる場合がある。その場合の正規表現の記述は以下のようになる。このとき、上で示した処理の流れによると、下位領域や上位領域の正規表現は桁数が固定である。以下の例では、正規表現の選択記号「｜」に囲まれた部分正規表現についてのみ示す。
修正前：“ＡｍＡｍ−１．．．Ａｎ＋１［ｖ１−ｖｑ］｛ｎ｝”
修正後：“ＡｍＡｍ−１．．．Ａｎ−ｔ＋４，Ａｎ−ｔ＋３．．．Ａｎ＋１［ｖ１−ｖｑ］｛ｔ｝（，［ｖ１−ｖｑ］｛３｝）｛ｓ｝”
ここで、ｓはｎ／３の商、ｔはｎ／３の余剰とする。
このように、正規表現結合部１０５は、ｎ＋１桁目以上については、ｎ−ｔ＋３×ｉ桁目とｎ−ｔ＋３×ｉ＋１桁目との間にカンマを挿入するとよい（ｉは自然数）。
【００９１】
上記の例では、１０進数の場合について示したが、ｖ１＝０、ｖｑ＝Ｆとすれば１６進数も同様に処理することができる。その他、本実施の形態と同様の形式を持つ属性であれば、いずれも同様に処理することができる。
【００９２】
さらに、ここまで、主に整数値の例を用いて説明してきたが、各桁の値は数字である必要はなく、１桁以上の数値や、順序のある単語の集合でもよい。例えば、日付の月の表記の仕方には、月の英語名（Ｊａｎｕａｒｙ、Ｆｅｂｒｕａｒｙ、Ｍａｒｃｈ、・・・、Ｄｅｃｅｍｂｅｒ）やその略語（Ｊａｎ、Ｆｅｂ、Ｍａｒ、・・・、Ｄｅｃ）が使用される場合もある。この場合、月を１２個の値を持つ１個の属性要素と見なしてもよい。このとき、ｖ１＝“Ｊａｎ”、ｖ２＝“Ｆｅｂ”、ｖ３＝“Ｍａｒ”、・・・、ｖ１２＝“Ｄｅｃ”と定義すれば、本実施の形態において示した手順で処理することができる。このような処理方法は、属性値が後述する実施の形態３に示す形式を持つような場合、特に有効である。
【００９３】
以上のように、本実施の形態に係る正規表現生成装置１００によれば、整数値のような特徴を持った属性の下限値、上限値、書式などを指定した属性範囲条件から、その下限値から上限値までの範囲に含まれる属性値を表現する文字列を照合するための正規表現を自動的に生成することができる。これにより、従来は正確に記述することが困難であった複雑な属性範囲条件を照合する正規表現を、特別な知識も試行錯誤も必要なく、容易に短時間で得ることができる。
【００９４】
実施の形態２．
本実施の形態について、主に実施の形態１との差異を説明する。
【００９５】
実施の形態１で説明したように、整数値のデータ型や書式の指定の仕方には様々なものがある。例えば、符合の有無、最大桁数、何進数表記であるか、整数値の値域、数値の先頭の０の有無、カンマ区切りの有無、表記する文字の種類、・・・など、これらの書式を属性範囲条件で細かく指定するのは煩雑である。そこで、本実施の形態では、正規表現生成装置１００において、予め設定された属性範囲条件を記憶装置１５１に記憶しておき、これを選択して利用できるようにする。
【００９６】
図８は、本実施の形態に係る正規表現生成装置１００の構成を示すブロック図である。
【００９７】
図８において、正規表現生成装置１００は、実施の形態１で説明した図１に示したものに加え、条件記憶部１０７、識別子入力部１０８を備える。
【００９８】
条件記憶部１０７は、複数の属性範囲条件データを予め記憶装置１５１に記憶しておく。条件記憶部１０７は、各属性範囲条件データを一意の識別子と対応付けて記憶装置１５１に記憶する。
【００９９】
識別子入力部１０８は、任意の識別子を入力装置１５３から入力する。
【０１００】
属性範囲条件入力部１０１は、識別子入力部１０８により入力された識別子に対応付けて条件記憶部１０７により記憶された属性範囲条件データを入力する。
【０１０１】
図９は、本実施の形態に係る正規表現生成方法を示すフローチャートである。図９のフローチャートに示すフローは、正規表現生成装置１００を実現するコンピュータ上で実行されるプログラム（正規表現生成プログラム）の処理手順に相当する。この処理手順において、正規表現生成プログラムは、以下に示す各処理をコンピュータに実行させる。
【０１０２】
正規表現生成装置１００の利用者がキーボード９０２やマウス９０３で識別子を指定すると、識別子入力部１０８は、その識別子をキーボード９０２やマウス９０３から入力する（ステップＳ５０１：識別子入力処理）。属性範囲条件入力部１０１は、条件記憶部１０７により磁気ディスク装置９２０に予め記憶されている複数の属性範囲条件データの中から、識別子入力部１０８により入力された識別子に対応付けて記憶された属性範囲条件データを読み出して入力する（ステップＳ５０２：属性範囲条件入力処理）。ステップＳ５０２の後は、実施の形態１で説明した図４のフローチャートと同様に、ステップＳ１０３〜Ｓ１０７の処理が実行される。
【０１０３】
このように、本実施の形態において、正規表現生成装置１００は、正規表現を生成する処理のために参照可能な記憶装置１５１内の記憶領域の一部に、正規表現生成規則（即ち、属性範囲条件）を記憶するための領域を設けておき、識別番号や識別名（いずれも識別子の一例）と属性値の書式や正規表現の生成手順（いずれも属性範囲条件に含まれる情報の一例）を組にして記憶しておく。属性範囲条件として、属性の下限値と上限値は、実施の形態１と同様にその都度指定し、属性の書式だけは、それを特定する識別番号や識別名を指定するようにしてもよい。また、このとき、属性範囲条件入力部１０１が、指定された識別番号や識別名に対応する書式の情報や正規表現生成手順を記憶装置１５１から読み出し、正規表現生成部１０４や正規表現結合部１０５が、その手順に従って正規表現を生成するようにしてもよい。あるいは、属性範囲条件入力部１０１が、属性の下限値と上限値を文字列で入力するようにし、正規表現生成部１０４や正規表現結合部１０５が、入力された文字列を分析してカンマ区切りの有無などを自動的に判別するようにしてもよい。
【０１０４】
さらに、正規表現生成規則を記憶するための領域を書き換え可能な領域に定義しておき、条件記憶部１０７が、属性の書式を表す識別番号や識別名と、属性のデータ型、書式、正規表現の生成手順などの情報をこの領域に追加できるようにしてもよい。
【０１０５】
正規表現生成規則を記憶するための領域は、ディスク装置や不揮発性メモリなどの記憶装置１５１に記憶され、正規表現の生成手順を実行する処理装置１５２から読み出すことができるように構成してもよいし、実行時には高速な不揮発性メモリ上に記憶されるように構成してもよい。
【０１０６】
実施の形態３．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１０７】
本実施の形態は、実施の形態１と異なる形式の属性について、正規表現を生成する処理の流れを説明するものである。本実施の形態における正規表現生成装置１００の構成は、実施の形態１で説明した図１に示したものと同じである。また、正規表現生成装置１００の動作（正規表現生成方法、正規表現生成プログラムの処理手順）は、実施の形態１で説明した図４に示したものと同じである。
【０１０８】
以下、実施の形態１と同様に、正規表現を生成する処理の流れを、例を交えて説明する。ここで説明するのは、属性範囲条件の下限値Ａと上限値Ｂに対して、Ａ≦Ｘ＜Ｂを満たす値Ｘ（下限値Ａから上限値Ｂまでの属性値Ｘ）を表現する文字列を照合するための正規表現を生成する処理の流れである。
【０１０９】
実施の形態１とは異なり、ここでの属性値を以下のように表すものとする。
下限値Ａ：Ａ１Ａ２．．．Ａｎ−１Ａｎ
上限値Ｂ：Ｂ１Ｂ２．．．Ｂｍ−１Ｂｍ
Ａｉ、Ｂｊ（１≦ｉ≦ｎ、１≦ｊ≦ｍ）は、それぞれ１個の数字や文字で、その値域をｖ１≦Ａｉ、Ｂｊ≦ｖｑとする。本実施の形態における属性値の大小関係は、次の順序で決まるものとする。
（１）Ａ１＝Ｂ１，Ａ２＝Ｂ２，．．．，Ａｋ−１＝Ｂｋ−１（１≦ｋ≦ｎ又はｍ）のとき、Ｂｋ＞ＡｋならばＢ＞Ａ
（２）Ａ１＝Ｂ１，Ａ２＝Ｂ２，．．．，Ａｎ＝Ｂｎでかつｍ＞ｎならばＢ＞Ａ
Ａｉ＋１と記述してＡｉの値を１大きくすることとし、Ａｉ＝ｖｊの場合Ａｉ＋１＝ｖｊ＋１とする。ただし、Ａｉ＝ｖｑの場合はＡｉ＋１＝ｖ１とし、さらにＡｉ＋１＋１とする。同様に、Ａｉ−１と記述してＡｉの値を１小さくすることとし、Ａｉ＝ｖｊの場合Ａｉ−１＝ｖｊ−１とする。ただし、Ａｉ＝ｖ１の場合はＡｉ−１＝ｖｑとし、さらにＡｉ＋１−１とする。属性値Ａを１大きくすることをＡ＋１と記述し、Ａｎ＋１を意味するものとする。同様に、属性値Ａを１小さくすることをＡ−１と記述し、Ａｎ−１と意味するものとする。
【０１１０】
このような特徴を持つ属性値としては、文字列（辞書式順）や小数点数の小数部分（小数点以下の値）などがある。
【０１１１】
ここで、下限値Ａと上限値Ｂが等しい場合は、ステップＳ１０２を実行するまでもなく以下の正規表現を出力するだけでよい。
正規表現：“Ａ１Ａ２．．．Ａｎ−１Ａｎ”
【０１１２】
以降は、下限値と上限値が等しくない場合について説明する。
【０１１３】
ステップＳ１０２では、演算部１０２は、属性値を下位、中位、上位の３領域に分割する。このとき、まずは下限値と上限値で桁数の少ない方に合わせて考えるとよい。
【０１１４】
まず、以下のようなｒ桁の下限値Ａ´と上限値Ｂ´に対して、中位領域を求める。
下限値Ａ´：Ａ１Ａ２．．．Ａｒ−１Ａｒ
上限値Ｂ´：Ｂ１Ｂ２．．．Ｂｒ−１Ｂｒ
ここでｒはｎとｍの値の小さい方とする。中位領域を求める処理の流れを図１０に示す。図１０は、図５のステップＳ２０１を「ｉ＝１」とし、ステップＳ２０４、Ｓ２０６を「ｉ＝ｉ＋１」とし、ステップＳ２０７を「ｉ≦ｒ？」としたものである。
【０１１５】
図１０において、演算部１０２は、最下位桁（１桁目）から順番に（ステップＳ６０１）属性値の下限値Ａ´と上限値Ｂ´の同じ桁の値をＣＰＵ９１１により比較していく（ステップＳ６０２）。ある桁（ｉ桁目）について、Ａ´とＢ´とで値が同じ場合、演算部１０２は、ＬとＵの同じ桁（Ｌｉ、Ｕｉ）もその値（Ａｉ）に設定し（ステップＳ６０３）、次の桁について（ステップＳ６０４）Ａ´とＢ´を比較する。比較した桁について、Ａ´とＢ´とで値が異なる場合、演算部１０２は、Ｌの同じ桁（Ｌｉ）をＡ´の値より１大きい値（Ａｉ＋１）に設定するとともに、Ｕの同じ桁（Ｕｉ）をＢ´の値より１小さい値（Ｂｉ−１）に設定する（ステップＳ６０５）。そして、次の桁からｒ桁目までの各桁について（ステップＳ６０６、Ｓ６０７）、Ｌをその桁の最小値（ｖ１）に設定するとともに、Ｕをその桁の最大値（ｖｑ）に設定する（ステップＳ６０８）。その結果、中位領域の下限値Ｌと上限値Ｕが得られる。このとき、属性値記憶部１０３はＬとＵをＲＡＭ９１４に記憶している。
【０１１６】
上記の手順に従うと、演算部１０２は、次のように下位領域（Ａ´〜Ｌ−１）、中位領域（Ｌ〜Ｕ）、上位領域（Ｕ＋１〜Ｂ´）を求めることができる。
下位領域：Ａ１Ａ２．．．Ａｒ−１Ａｒ〜Ａ１．．．Ａｋ（ｖｑ）ｋ−１．．．（ｖｑ）ｒ
中位領域：Ａ１．．．Ａｋ−１（Ａｋ＋１）（ｖ１）ｋ＋１．．．（ｖ１）ｒ〜Ｂ１．．．Ｂｋ−１（Ｂｋ−１）（ｖｑ）ｋ＋１．．．（ｖｑ）ｒ
上位領域：Ｂ１．．．Ｂｋ（ｖ１）ｋ−１．．．（ｖ１）ｒ〜Ｂ１Ｂ２．．．Ｂｒ−１Ｂｒ
ただし、Ａ１＝Ｂ１，．．．，Ａｋ−１＝Ｂｋ−１（１≦ｋ≦ｒ）
このとき、属性値記憶部１０３は下限値Ａ´、上限値Ｂ´、第１の値（Ｌ−１）、第２の値（Ｕ＋１）をＲＡＭ９１４に記憶している。
【０１１７】
続いて、ｎ＞ｍの場合は、演算部１０２は、下位領域にｒ＋１桁目からｎ桁目までを追加する。
下位領域：Ａ１．．．ＡｒＡｒ＋１．．．Ａｎ〜Ａ１．．．Ａｋ（ｖｑ）ｋ−１．．．（ｖｑ）ｒ（ｖｑ）ｒ＋１．．．（ｖｑ）ｎ
一方、ｎ＜ｍの場合は、演算部１０２は、上位領域にｒ＋１桁目からｍ桁目までを追加する。
上位領域：Ｂ１．．．Ｂｋ（ｖ１）ｋ−１．．．（ｖ１）ｒ（ｖ１）ｒ＋１．．．（ｖ１）ｍ〜Ｂ１．．．ＢｒＢｒ＋１．．．Ｂｍ
【０１１８】
ステップＳ１０３において、正規表現生成部１０４は、中位領域の正規表現を生成する。中位領域の正規表現は、中位領域のＡｋ、Ｂｋの値にのみ依存し、以下の通り生成することができる。１桁目からｋ−１桁目までの値は、ステップＳ１０６において、共通部分として処理できるため、ここでは省略している。
中位領域の正規表現：“［（Ａｋ＋１）−（Ｂｋ−１）］”
ここで、Ｂｋ−Ａｋ＝１の場合、（Ａｋ＋１）＞（Ｂｋ−１）となるが、この場合は中位領域の正規表現を出力しないものとする。それ以外は同様に処理することができる。
【０１１９】
図１１は、以下のような属性値の範囲に対応する正規表現の生成処理の流れを示す。
下限値：ＡｋＡｋ−１．．．Ａｎ
上限値：（ｖｊ）ｋ（ｖｑ）ｋ−１．．．（ｖｑ）ｎ（ただし、ｖｊ≧Ａｋ）
【０１２０】
図１１の処理の流れは、図６に示したものとほぼ同じであり、正規表現生成部１０４は、最下位の桁から上位の桁に向かって処理を進める。ステップＳ７０１において、正規表現生成部１０４は、ＲＡＭ９１４内の正規表現の格納領域（Ｅ）に初期値として“Ａｋ．．．Ａｎー１［Ａｎ−ｖｑ］”をセットする。ステップＳ７０２以降では、下位２桁目から始めてｋ＋１桁目までステップＳ７０４〜Ｓ７０６の処理を繰り返す。ステップＳ７０３において、処理の対象がｋ桁目より下位の場合（ＹＥＳ）、ステップＳ７０４において、その桁の値がｖｑか否かによって処理を切り分ける。ｖｑの場合には（ＹＥＳ）、正規表現生成部１０４は特に何も出力せずに次の桁の処理に移行する。ｖｑではない場合には（ＮＯ）、正規表現生成部１０４は、正規表現の出力領域（Ｅ）の末尾に“｜Ａｋ．．．Ａｉ−１［（Ａｉ＋１）−ｖｑ］”を追加し、次の桁の処理に移行する。ステップＳ７０３において、ｋ＋１桁目までの処理が完了していた場合は（ＮＯ）、ステップＳ７０７に進む。ステップＳ７０７において、Ａｋとｖｊが等しい場合は（ＹＥＳ）、正規表現生成部１０４は何もせずに処理を終了する。Ａｋとｖｊが等しくない場合は（ＮＯ）、正規表現生成部１０４はステップＳ７０８に進み、正規表現格納領域（Ｅ）の末尾に“｜［（Ａｋ＋１）−ｖｊ］”を追加し、処理を終了する。処理が終了した時点で正規表現の格納領域（Ｅ）に格納されているものが、上記の範囲に対応する正規表現である。
【０１２１】
ステップＳ１０４における下位領域の正規表現生成処理の流れは、図１１においてＡ１＝Ｂ１，．．．，Ａｋ−１＝Ｂｋ−１（１≦ｋ≦ｎ）を満たすｋに対して下限値と上限値を以下のようにした場合に相当する。
下限値：ＡｋＡｋ＋１．．．Ａｎ
上限値：Ａｋ（ｖｑ）ｋ＋１．．．（ｖｑ）ｎ
そして、ステップＳ１０４において、正規表現生成部１０４が生成する下位領域の正規表現は以下の通りとなる。１桁目からｋ−１桁目までの値は、ステップＳ１０６において、共通部分として処理できるため、ここでも省略している。
下位領域の正規表現：“ＡｋＡｋ＋１．．．Ａｎ−１［Ａｎ−ｖｑ］｜ＡｋＡｋ＋１．．．Ａｎ−２［（Ａｎ−１＋１）−ｖｑ］｜．．．｜Ａｋ［（Ａｋ＋１＋１）−ｖｑ］”
【０１２２】
図１２は、以下のような属性値の範囲に対応する正規表現の生成処理の流れを示す。
下限値：（ｖｊ）ｋ（ｖ１）ｋ＋１．．．（ｖ１）ｍ（ただし、ｖｊ≦Ｂｋ）
上限値：ＢｋＢｋ＋１．．．Ｂｍ
【０１２３】
図１２の処理の流れは、図７に示したものとほぼ同じであり、正規表現生成部１０４は、最下位の桁から上位の桁に向かって処理を進める。ステップＳ８０１において、正規表現生成部１０４は、ＲＡＭ９１４内の正規表現の格納領域（Ｅ）に初期値として“Ｂｋ．．．Ｂｍ−１［ｖ１−（Ｂｍ−１）］”をセットする。ステップＳ８０２以降では、下位２桁目から始めてｋ＋１桁目までステップＳ８０４〜Ｓ８０６の処理を繰り返す。ステップＳ８０３において、処理の対象がｋ桁目より下位の場合（ＹＥＳ）、ステップＳ８０４において、その桁の値がｖ１か否かによって処理を切り分ける。ｖ１の場合には（ＹＥＳ）、正規表現生成部１０４は特に何も出力せずに次の桁の処理に移行する。ｖ１ではない場合には（ＮＯ）、正規表現生成部１０４は、正規表現の出力領域（Ｅ）の末尾に“｜Ｂｋ．．．Ｂｉ＋１［ｖ１−（Ｂｉ−１）］”を追加し、次の桁の処理に移行する。ステップＳ８０３において、ｋ＋１桁目までの処理が完了していた場合は（ＮＯ）、ステップＳ８０７に進む。ステップＳ８０７において、Ｂｋとｖｊが等しい場合は（ＹＥＳ）、正規表現生成部１０４は何もせずに処理を終了する。Ｂｋとｖｊが等しくない場合は（ＮＯ）、正規表現生成部１０４はステップＳ８０８に進み、正規表現格納領域（Ｅ）の末尾に“｜［ｖｊ−（Ｂｋ−１）］”を追加し、処理を終了する。処理が終了した時点で正規表現の格納領域（Ｅ）に格納されているものが、上記の範囲に対応する正規表現である。
【０１２４】
ステップＳ１０５における上位領域の正規表現生成処理の流れは、図１２においてＡ１＝Ｂ１，．．．，Ａｋー１＝Ｂｋー１（１≦ｋ≦ｍ）を満たすｋに対して下限値と上限値を以下のようにした場合に相当する。
下限値：Ｂｋ（ｖ１）ｋ＋１．．．（ｖ１）ｍ
上限値：ＢｋＢｋ＋１．．．Ｂｍ
そして、ステップＳ１０５において、正規表現生成部１０４が生成する上位領域の正規表現は以下の通りとなる。１桁目からｋ−１桁目までの値は、ステップＳ１０６において、共通部分として処理できるため、ここでも省略している。
上位領域の正規表現：“ＢｋＢｋ＋１．．．Ｂｍ−１［ｖ１−（Ｂｍ−１）］｜ＢｋＢｋ＋１．．．Ｂｍ−２［ｖ１−（Ｂｍ−１−１）］｜．．．｜Ｂｋ［ｖ１−（Ｂｋ＋１−１）］”
【０１２５】
ステップＳ１０６において、正規表現結合部１０５は、ステップＳ１０３〜Ｓ１０５で個別に生成された下位、中位、上位領域の正規表現を結合し、結合した正規表現に、ステップＳ１０３〜Ｓ１０５で省略されていた共通部分（１桁目からｋ−１桁目まで）を追加して、属性範囲条件に対応する正規表現を生成する。この正規表現は、属性範囲条件の下限値と上限値の共通部分と、下位、中位、上位領域の正規表現から、以下のような形となる。
“Ａ１．．．Ａｋ−１（＜下位領域の正規表現＞｜＜中位領域の正規表現＞｜＜上位領域の正規表現＞）”
また、中位領域がない場合に生成される正規表現は以下のような形式となる。
“Ａ１．．．Ａｋ−１（＜下位領域の正規表現＞｜＜上位領域の正規表現＞）”
【０１２６】
このような正規表現では、正規表現に記述された１又はｎ又はｍ文字まで文字列を照合した時点で、文字の照合を停止してしまう。よって、それよりも長い文字列については、ヒットはするものの、その文字列の末尾の位置まではわからないことがある。そこで、正規表現にヒットする文字列の終端の位置まで知りたい場合は、正規表現の末尾に“［ｖ１−ｖｑ］＊”を追加すればよい。
【０１２７】
また、上記の正規表現では、Ａ≦Ｘ＜Ｂを満たす値Ｘだけでなく、値ｖｉＸもヒットしてしまう。そこで、このようなヒットを避けたい場合には、正規表現の先頭に除外文字指定“［＾ｖ１−ｖｑ］”を追加するとよい。
【０１２８】
上記の方式を英小文字の文字列に適用した場合（全角英小文字又は半角英小文字いずれか１種類の場合）の具体例を示す。ここで、ｖ１＝ａ、ｖｑ＝ｚである。
【０１２９】
（例３−１）属性範囲条件：「ｅｎｄ」〜「ｓｔａｒｔ」
下位領域：「ｅｎｄ」〜「ｅｚｚ」
中位領域：「ｆａａ」〜「ｒｚｚ」
上位領域：「ｓａａａａ」〜「ｓｔａｒｔ」
正規表現：“（ｅｎ［ｄ−ｚ］｜ｅ［ｏ−ｚ］）｜［ｆ−ｒ］｜（ｓｔａｒ［ａ−ｓ］｜ｓｔａ［ａ−ｑ］｜ｓ［ａ−ｓ］）”
【０１３０】
また、上記の方式を０＜Ａ、Ｂ≦１となる下限値Ａと上限値Ｂに適用した場合の具体例を示す。
【０１３１】
（例３−２）属性範囲条件：０．００３２１〜０．８７６
下位領域：０．００３２１〜０．０９９９９
中位領域：０．１００〜０．７９９
上位領域：０．８００〜０．８７６
正規表現：“０．（（００３２［１−９］｜００３［３−９］｜００［４−９］｜０［１−９］）｜［１−７］｜（８７［０−５］｜８［０−６］））”
【０１３２】
これまでの説明では、属性値の下限値Ａ、上限値Ｂともに指定されている場合について示してきた。ここでは、上限値Ｂの指定がない場合や上限値が「無限大」と指定された場合について説明する。属性のデータ型として最大値Ｂ´が存在する場合は、正規表現結合部１０５は下限値Ａから上限値Ｂ´までの正規表現を生成すればよい。属性のデータ型として最大値がない場合には、以下のように処理するとよい。
【０１３３】
まず、正規表現結合部１０５は、下限値Ａと同じ桁数の属性値の最大値について正規表現を生成する。即ち、以下のようなｎ桁の下限値と上限値について正規表現を生成する。
下限値Ａ：Ａ１．．．Ａｎ
上限値Ｂ´：（ｖｑ）１．．．（ｖｑ）ｎ
その上で、正規表現結合部１０５は、（ｖｑ）１．．．（ｖｑ）ｎ．．．の正規表現“ｖｑ｛ｎ｝［ｖ１−ｖｑ］＊［ｖ２−ｖｑ］”を追加する。生成される正規表現は以下の形式になる。
正規表現：“＜Ａ〜Ｂ´の範囲の正規表現＞｜ｖｑ｛ｎ｝［ｖ１−ｖｑ］＊［ｖ２−ｖｑ］”
【０１３４】
下限値Ａの指定がない場合や下限値が「無限小」と指定された場合について説明する。まず、属性のデータ型として最小値Ａ´があるならば、正規表現結合部１０５は下限値Ａ´と上限値Ｂについて正規表現を生成するようにすればよい。それ以外の場合は、以下のような下限値Ａ´と上限値Ｂについて正規表現を生成すればよい。
下限値Ａ´：（ｖ１）１
上限値Ｂ：Ｂ１．．．Ｂｍ
【０１３５】
英字に大文字と小文字が、文字に全角文字と半角文字があるように、属性の各桁の値域が２種類以上存在する場合がある。その場合は、実施の形態１の属性と同様に、選択「｜」や文字クラスを使用して並べて記述することにより、対応する正規表現を生成することができる。
【０１３６】
以上のように、本実施の形態に係る正規表現生成装置１００によれば、文字列のような特徴を持つ属性値の下限値、上限値、書式などを指定した属性範囲条件から、その下限値から上限値までの範囲に含まれる属性値を表現する文字列を照合するための正規表現を自動的に生成することができる。これにより、従来は正確に記述することが困難であった複雑な属性範囲条件を照合する正規表現を、特別な知識も試行錯誤も必要なく、容易に短時間で得ることができる。
【０１３７】
実施の形態４．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１３８】
本実施の形態は、複数の属性値と、属性値間を区切る区切り文字とから構成される階層構造を持つ属性について、その正規表現を生成する処理の流れを説明するものである。本実施の形態における正規表現生成装置１００の構成は、実施の形態１で説明した図１に示したものと同じである。また、正規表現生成装置１００の動作（正規表現生成方法、正規表現生成プログラムの処理手順）は、実施の形態１で説明した図４に示したものと同じである。上記のような階層構造を持つ形式の属性の正規表現を生成するため、正規表現生成装置１００は、階層構造における最上位の階層から順に下位の階層に向かって、実施の形態１や３と同様の手順を適用することにより、正規表現を生成していく。
【０１３９】
本実施の形態では、正規表現生成装置１００の利用者は属性の上限値、下限値、区切り文字、階層の順序、各階層の属性の形式、値域などを属性範囲条件データとして指定する。そして、ステップＳ１０１では、属性範囲条件入力部１０１が、その属性範囲条件データを入力する。つまり、属性範囲条件入力部１０１は、属性値の書式として、属性値が区切り文字を用いた階層構造をとる属性値であり、属性値全体を区切り文字で区切った部分の各々がその階層構造の１階層であることを示す属性範囲条件データを入力する。このような階層構造を持つ属性値としては、日付、時刻、ＩＰ（Ｉｎｔｅｒｎｅｔ・Ｐｒｏｔｏｃｏｌ）アドレス、小数点数などがある。例えば日付は、最上位から年、月、日という３つの階層からなる階層構造をとるものであり、よく使用される区切り文字としてはスラッシュ「／」がある。また、属性値が日付の場合、各階層はいずれも正の整数値で、月の階層の値域は１〜１２、日の階層の値域は１〜３１（又は、２８、２９、３０）である。例えば、属性値が日付や時刻であれば、属性範囲条件入力部１０１は、属性値の書式として、属性値が日付や時刻であることを示す属性範囲条件データを入力することとなる。また、例えば、属性値がＩＰアドレスであれば、属性範囲条件入力部１０１は、属性値の書式として、属性値がＩＰアドレスであることを示す属性範囲条件データを入力することとなる。
【０１４０】
ステップＳ１０２において、演算部１０２は、属性値全体について、各階層を１桁として、第１の値と第２の値とを演算する。
【０１４１】
ステップＳ１０３において、正規表現生成部１０４は、第１の値と第２の値との間に属性値が存在する場合には、属性値全体について、各階層を１桁として、中位領域データを生成する。その後さらに、その中位領域データを各階層を正規表現で表すものにＣＰＵ９１１で変換する。また、ステップＳ１０４において、正規表現生成部１０４は、属性値全体について、各階層を１桁として、下位領域データを生成する。その後に、その下位領域データを各階層を正規表現で表すものにＣＰＵ９１１で変換する。同様に、ステップＳ１０５において、正規表現生成部１０４は、属性値全体について、各階層を１桁として、上位領域データを生成する。その後に、その上位領域データを各階層を正規表現で表すものにＣＰＵ９１１で変換する。
【０１４２】
このように、本実施の形態において、正規表現生成装置１００は、複数の値と区切り文字とから構成される階層を持った属性値の上限値と下限値とを指定する属性範囲条件を正規表現に変換する検索条件生成方式、又は、この方式を計算機上で実行するための検索条件生成プログラムを実装するものである。この方式では、最上位の階層から最下位の階層に向かって順番に、それぞれの値を実施の形態１や３と同様の手順に従って正規表現に変換する。
【０１４３】
上記検索条件生成方式では、例えば、日付の属性範囲条件を正規表現に変換する。また、例えば、時刻の属性範囲条件を正規表現に変換する。また、例えば、ＩＰアドレスの属性範囲条件を正規表現に変換する。
【０１４４】
以下、実施の形態１や３と同様に、正規表現を生成する処理の流れを、例を交えて説明する。ここで説明するのは、属性範囲条件の下限値Ａと上限値Ｂに対して、Ａ≦Ｘ≦Ｂを満たす値Ｘ（下限値Ａから上限値Ｂまでの属性値Ｘ）の文字列表現を受理する正規表現の生成処理の流れである。ここでは、区切り文字を＜ｄ１＞＜ｄ２＞．．．として、属性値を次のように表すものとする。
下限値Ａ：Ａ１＜ｄ１＞Ａ２＜ｄ２＞．．．＜ｄｎ−１＞Ａｎ
上限値Ｂ：Ｂ１＜ｄ１＞Ｂ２＜ｄ２＞．．．＜ｄｎ−１＞Ｂｎ
ここで、Ａｉ、Ｂｉ（１≦ｉ≦ｎ）は各階層の１桁以上の属性値を表し、その値域はＶｉｍｉｎ≦Ａｉ、Ｂｉ≦Ｖｉｍａｘとする。
【０１４５】
ステップＳ１０２では、演算部１０２は、各階層を１桁の値と見なして全体を下位、中位、上位の各領域に分割する。このときの分割手順は、図５又は図１０に示したのと同様の手順によって行う。即ち、属性範囲条件Ａ〜Ｂを以下のように分割する。階層構造のある属性では、第２階層以下（即ち、最上位層以外の階層）の属性値が実施の形態１の形式の属性値の場合、Ｖｉｍｉｎ、Ｖｉｍａｘが定義されていると考えられる。それ以外の場合には、Ａｉと桁数が同じ値の範囲で、最小値、最大値を考えればよい。
下位領域：Ａ１＜ｄ１＞Ａ２＜ｄ２＞．．．＜ｄｎ−１＞Ａｎ〜Ａ１＜ｄ１＞Ｖ２ｍａｘ＜ｄ２＞．．．＜ｄｎ−１＞Ｖｎｍａｘ
中位領域：（Ａ１＋１）＜ｄ１＞Ｖ２ｍｉｎ＜ｄ２＞．．．＜ｄｎ−１＞Ｖｎｍｉｎ〜（Ｂ１−１）＜ｄ１＞Ｖ２ｍａｘ＜ｄ２＞．．．＜ｄｎ−１＞Ｖｎｍａｘ
上位領域：Ｂ１＜ｄ１＞Ｖ２ｍｉｎ＜ｄ２＞．．．＜ｄｎ−１＞Ｖｎｍｉｎ〜Ｂ１＜ｄ１＞Ｂ２＜ｄ２＞．．．＜ｄｎ−１＞Ｂｎ
【０１４６】
ステップＳ１０３において、正規表現生成部１０４は、中位領域について、階層ごとに正規表現を生成することにより、そのまま正規表現を生成することができる。
中位領域の正規表現：“＜（Ａ１＋１）〜（Ｂ１−１）の正規表現＞＜ｄ１＞＜Ｖ２ｍｉｎ〜Ｖ２ｍａｘの正規表現＞＜ｄ２＞．．．＜ｄｎ−１＞＜Ｖｎｍｉｎ〜Ｖｎｍａｘの正規表現＞”
正規表現生成部１０４は、各階層の正規表現の生成方法として、それぞれの属性値の形式に従って、実施の形態１や３に示したものと同様の手順を用いることができる。つまり、正規表現生成部１０４は、各階層について、演算部１０２が行う処理と同様に、下位、中位、上位領域に値の範囲を分割し、各領域に関して正規表現を生成し、正規表現結合部１０５が行う処理と同様に、生成した正規表現を以下の形式で書き出す。
正規表現：“（＜ｉ階層の下位領域の正規表現＞｜＜ｉ階層の中位領域の正規表現＞｜＜ｉ階層の上位領域の正規表現＞）”
これにより、正規表現生成部１０４は、各階層を１桁として扱っていた中位領域の正規表現を、各階層もそれぞれに対応する正規表現を含んだ正規表現に変換することができる。
【０１４７】
下位領域に関しては、ステップＳ１０４において、正規表現生成部１０４が、第２階層以下を、上記の手順と同様にして下位、中位（下位、上位と考えることもできる）の各領域に分割する。上位領域がない（中位領域がないと考えることもできる）のは、元の下位領域の上限値の第２階層の値が、その属性の値域の最大値Ｖ２ｍａｘになっているためである。これにより、下位領域は、さらに下位領域と中位領域に分割できる。
下位領域：Ａ１＜ｄ１＞Ａ２＜ｄ２＞．．．＜ｄｎ−１＞Ａｎ〜Ａ１＜ｄ１＞Ａ２＜ｄ２＞Ｖ３ｍａｘ＜ｄ３＞．．．＜ｄｎ−１＞Ｖｎｍａｘ
中位領域：Ａ１＜ｄ１＞（Ａ２＋１）＜ｄ２＞Ｖ３ｍｉｎ＜ｄ３＞．．．＜ｄｎ−１＞Ｖｎｍｉｎ〜Ａ１＜ｄ１＞Ｖ２ｍａｘ＜ｄ２＞．．．＜ｄｎ−１＞Ｖｎｍａｘ
続いて、正規表現生成部１０４は、ステップＳ１０３と同様の手順で中位領域の正規表現を生成するとともに、下位領域の次の階層以下をさらに分割する。このようにして、下位、中位領域への分割と中位領域の正規表現の生成とを最下位の階層まで繰り返すことにより、正規表現生成部１０４は、各階層を１桁として扱っていた下位領域の正規表現を、各階層もそれぞれに対応する正規表現を含んだ正規表現に変換することができる。
【０１４８】
上位領域に関しても、ステップＳ１０５において、正規表現生成部１０４が、同様に第２階層以下を中位、上位（下位、上位と考えることもできる）の各領域に分割する。下位領域がない（中位領域がないと考えることもできる）のは、元の上位領域の下限値の第２階層の値が、その属性の値域の最小値Ｖ２ｍｉｎになっているためである。これにより、上位領域は、さらに中位領域と上位領域に分割できる。
中位領域：Ｂ１＜ｄ１＞Ｖ２ｍｉｎ＜ｄ２＞．．．＜ｄｎ−１＞Ｖｎｍｉｎ〜Ｂ１＜ｄ１＞（Ｂ２−１）＜ｄ２＞Ｖ３ｍａｘ＜ｄ３＞．．．＜ｄｎ−１＞Ｖｎｍａｘ
上位領域：Ｂ１＜ｄ１＞Ｂ２＜ｄ２＞Ｖ３ｍｉｎ＜ｄ３＞．．．＜ｄｎ−１＞Ｖｎｍｉｎ〜Ｂ１＜ｄ１＞Ｂ２＜ｄ２＞．．．＜ｄｎ−１＞Ｂｎ
続いて、正規表現生成部１０４は、ステップＳ１０３と同様の手順で中位領域の正規表現を生成するとともに、上位領域の次の階層以下を同様に分割する。このようにして、中位、上位領域への分割と中位領域の正規表現の生成とを最下位の階層まで繰り返すことにより、正規表現生成部１０４は、各階層を１桁として扱っていた上位領域の正規表現を、各階層もそれぞれに対応する正規表現を含んだ正規表現に変換することができる。
【０１４９】
ステップＳ１０４及びＳ１０５の正規表現生成処理において、第ｋ階層以下（２≦ｋ≦ｎ）の全階層の値が、全ての値の範囲をとる場合、即ち、以下の場合には値の範囲を分割する必要はない。
下限値：Ａ１＜ｄ１＞．．．＜ｄｋ−２＞Ａｋ−１＜ｄｋ−１＞Ｖｋｍｉｎ＜ｄｋ＞．．．＜ｄｎ−１＞Ｖｎｍｉｎ
上限値：Ｂ１＜ｄ１＞．．．＜ｄｋ−２＞Ｂｋ−１＜ｄｋ−１＞Ｖｋｍａｘ＜ｄｋ＞．．．＜ｄｎ−１＞Ｖｎｍａｘ
そして、正規表現生成部１０４は、ｋ−１桁目以下に対する正規表現を、以下のようにして生成することができる。
正規表現：“［Ａｋ−１−Ｂｋ−１］＜ｄｋ−１＞＜Ｖｋｍｉｎ〜Ｖｋｍａｘの正規表現＞＜ｄｋ＞．．．＜ｄｎ−１＞＜Ｖｎｍｉｎ〜Ｖｎｍａｘの正規表現＞”
【０１５０】
ステップＳ１０６において、正規表現結合部１０５は、ステップＳ１０３〜Ｓ１０５で個別に生成された下位、中位、上位領域の正規表現を結合して、以下のように属性範囲条件に対応する正規表現を生成する。
“＜下位領域の正規表現＞｜＜中位領域の正規表現＞｜＜上位領域の正規表現＞”
中位領域がない場合に生成される正規表現は以下のような形式となる。
“＜下位領域の正規表現＞｜＜上位領域の正規表現＞”
【０１５１】
上記の方式を日付に適用した場合の具体例を示す。典型的な日付の形式として、ここでは年月日がスラッシュ「／」で区切られているものとする。
【０１５２】
（例４−１）属性範囲条件：１９９６／１１／１５〜２００６／９／２０
【０１５３】
属性範囲条件入力部１０１は、属性範囲条件の入力として、下限値、上限値の他に、区切り文字「／」、属性値の種類（日付）、年月日の順序などを指定する。ここで、実施の形態２と同様に、条件記憶部１０７が、正規表現を生成する処理のために参照可能な記憶装置１５１内の記憶領域の一部に、複数種類の日付の形式を記憶しておき、識別子入力部１０８が識別子を指定することにより、自動的に対応する日付の形式を選択できるようにしてもよい。この場合、属性範囲条件入力部１０１は、条件記憶部１０７により記憶装置１５１に予め記憶されている複数の属性範囲条件データの中から、識別子入力部１０８により入力された識別子に対応付けて記憶された属性範囲条件データを読み出して入力する。そして、この属性範囲条件データに基づいて、正規表現が生成される。あるいは、演算部１０２や正規表現生成部１０４などが、属性範囲条件入力部１０１により指定された下限値、上限値から日付の形式を自動的に識別するようにしてもよい。例えば、下限値が「Ａ３年Ａ２月Ａ１日」（Ａ３、Ａ２、Ａ１はいずれも数値）と指定されたならば、区切り文字は「年」「月」「日」で、左から順に上位の階層であることを容易に認識することができる。ここで、日付を、あたかも０≦Ａ３、１≦Ａ２≦１２、１≦Ａ１≦３１という値域の属性要素からなる３桁の属性Ａ３Ａ２Ａ１であるかのように扱うこともできる。
【０１５４】
上記の手順に従うと、ステップＳ１０２において、演算部１０２は、この例の属性範囲を以下の通り下位、中位、上位領域に分割できる。
下位領域：１９９６／１１／１５〜１９９６／１２／３１
中位領域：１９９７／１／１〜２００５／１２／３１
上位領域：２００６／１／１〜２００６／９／２０
【０１５５】
ステップＳ１０３において、正規表現生成部１０４は、中位領域の正規表現を以下の通りに生成する。
中位領域の正規表現：“＜１９９７〜２００５の正規表現＞／＜１〜１２の正規表現＞／＜１〜３１の正規表現＞“
【０１５６】
ステップＳ１０４において、正規表現生成部１０４は、下位領域（１９９６／１１／１５〜１９９６／１２／３１）を、さらに下位と中位領域とに分割できる。
下位領域：１９９６／１１／１５〜１９９６／１１／３１
中位領域：１９９６／１２／１〜１９９６／１２／３１
これより、元の属性範囲の下位領域の正規表現は、以下の通り生成される。
下位領域（１９９６／１１／１５〜１９９６／１２／３１）の正規表現：“１９９６／（１１／＜１５〜３１の正規表現＞｜１２／＜１〜３１の正規表現＞）”
【０１５７】
ステップＳ１０５において、正規表現生成部１０４は、上位領域（２００６／１／１〜２００６／９／２０）を、さらに中位と上位領域とに分割できる。
中位領域：２００６／１／１〜２００６／８／３１
上位領域：２００６／９／１〜２００６／９／２０
これより、元の属性範囲の上位領域の正規表現は、以下の通り生成される。
上位領域（２００６／１／１〜２００６／９／２０）の正規表現：“２００６（＜１〜８の正規表現＞／＜１〜３１の正規表現＞｜９／＜１〜２０の正規表現＞）”
【０１５８】
ステップＳ１０６において、正規表現結合部１０５は、上記属性範囲条件の正規表現を以下のように構成することとなる。
正規表現：“（１９９６／（１１／＜１５〜３１の正規表現＞｜１２／＜１〜３１の正規表現＞））｜（＜１９９７〜２００５の正規表現＞／＜１〜１２の正規表現＞／＜１〜３１の正規表現＞）｜（２００６（＜１〜８の正規表現＞／＜１〜３１の正規表現＞｜９／＜１〜２０の正規表現＞））”
これを展開すると、次のような正規表現が得られる。
正規表現：“（１９９６／（１１／（１［５−９］｜２［０−９］｜３［０−１］）｜１２／（［０−９］｜［１−２］［０−９］｜３［０−１］）））｜（（１９９［７−９］｜２００［０−５］）／（［１−９］｜１［０−２］）／（［０−９］｜［１−２］［０−９］｜３［０−１］））｜（２００６／（［１−８］／（［０−９］｜［１−２］［０−９］｜３［０−１］）｜９／（［１−９］｜１［０−９］｜２０）））”
【０１５９】
上記の日付の例では、「１１／３１」という本来存在しない日付まで検索してしまう。ここで、厳密に日の値域を処理したいのであれば、以下の例のように日の値域が異なるグループごとに正規表現を分けて生成すればよい。
修正前：“＜１〜１２の正規表現＞／＜１〜３１の正規表現＞”
修正後：“（１｜３｜５｜７｜８｜１０｜１２）／＜１〜３１の範囲の正規表現＞｜（４｜６｜９｜１１）／＜１〜３０の範囲の正規表現＞｜２／＜１〜２８の範囲の正規表現＞”
【０１６０】
これまでの説明では、属性値の下限値Ａ、上限値Ｂともに指定されている場合について示してきた。ここでは、上限値Ｂの指定がない場合や上限値が「無限大」と指定された場合について説明する。属性のデータ型として最大値Ｂ´が存在する場合は、正規表現結合部１０５は下限値Ａから上限値Ｂ´までの正規表現を生成すればよい。属性のデータ型として最大値がない場合には、第１階層の値に着目して処理するとよい。
【０１６１】
まず、正規表現結合部１０５は、下限値Ａの第１階層の値と同じ桁数ｍの属性値の最大値を第１階層に持つような属性値の中で値が最も大きいもの、即ち、第２階層以下の値が全てＶｉｍａｘ（２≦ｉ≦ｎ）であるような値を上限値として正規表現を生成する。例えば、「２００６／９／２０」以降の日付を検索するための正規表現であれば、「２００６／９／２０」〜「９９９９／１２／３１」の属性範囲条件に対して正規表現を生成する。さらに、第１階層の値がｎ＋１桁以上の任意の属性値を検索する正規表現を追加する。上記の例であれば、５桁以上の年を表現する正規表現を“［１−９］［０−９］｛４，｝”と書くことができる。
【０１６２】
下限値Ａの指定がない場合や下限値が「無限小」と指定された場合について説明する。まず、属性のデータ型として最小値Ａ´があるならば、正規表現結合部１０５は下限値Ａ´と上限値Ｂについて正規表現を生成するようにすればよい。それ以外の場合は、第１階層以下の値が最小値Ｖｉｍｉｎ（１≦ｉ≦ｎ）であるような属性値を下限値として、正規表現を生成すればよい。
【０１６３】
階層構造を持つ属性の属性範囲条件による検索には、次のような応用も考えられる。
【０１６４】
（例４−２）属性範囲条件：２００６年９月〜２００６年１２月の平日
上記の条件を満たす日付を表す文字列を照合するための正規表現の生成手順を示す。上記の条件は、次の点でこれまで説明した属性範囲条件と異なる。
（１）「月」と「曜日」の２階層に範囲が設定されている。先に示した日付の属性範囲条件の例は、「年」と「月」に範囲が設定されているが、値としての実体は連続値である。
（２）第３階層の「日」に明示的な範囲条件が設定されていない。
（３）「日」と「曜日」は連動して変化する。厳密には上下の階層関係にない値である。
ここで、簡単のためにここでの日付の属性値は、左から順に「年」「月」「日」「曜日」が並んでおり、「年」「月」「日」間の区切り文字はスラッシュ「／」、「日」と「曜日」間の区切り文字は空白文字（厳密には、全角空白文字又は半角空白文字いずれか一方）であるとする。また、「曜日」の値域は、Ｖ４ｍｉｎ＝“ＳＵＮ”、Ｖ４ｍａｘ＝“ＳＡＴ”という値を取るものとする。この属性範囲条件の第３階層は明示的に設定されていないが、Ｖ３ｍｉｎ〜Ｖ３ｍａｘの値をとると考えてよい。このような属性範囲条件は以下のように考えられる。
属性範囲条件１：２００６／９／１〜２００６／１２／３１
属性範囲条件２：ＭＯＮ〜ＦＲＩ
【０１６５】
あとは、先に説明した日付の属性範囲条件の正規表現を生成する手順に従って、正規表現結合部１０５が属性範囲条件１の正規表現を生成し、さらに区切り文字に続けて属性範囲条件２の正規表現“（ＭＯＮ｜ＴＵＥ｜ＷＥＤ｜ＴＨＵ｜ＦＲＩ）”を結合すればよい。これにより最終的に生成される正規表現は以下のようになる。
正規表現：“（２００６／（９｜１［０−２］）／（［１−９］｜［１２］［０−９］｜３［０１］））  （ＭＯＮ｜ＴＵＥ｜ＷＥＤ｜ＴＨＵ｜ＦＲＩ）”
【０１６６】
次に、上記の方式を時刻に適用した場合の具体例を示す。ここでは、時分秒の各階層がコロン「：」で区切られ、時間は２４時間表記であるものとする。
【０１６７】
（例４−３）属性範囲条件：８：４５：００〜１７：１５：００
【０１６８】
ステップＳ１０２において、演算部１０２は、この属性範囲条件を以下のように下位、中位、上位領域に分割できる。
下位領域：８：４５：００〜８：５９：５９
中位領域：９：００：００〜１６：５９：５９
上位領域：１７：００：００〜１７：１５：００
【０１６９】
ここから、正規表現生成部１０４及び正規表現結合部１０５が同様に処理して、以下の通り正規表現を生成することができる。
正規表現：“（８：（４［５−９］｜５［０−９］）：（０［０−９］｜［１−４］［０−９］｜５［０−９］）｜（９｜１［０−６］）：（［０−５］［０−９］）：（０［０−９］｜［１−４］［０−９］｜５［０−９］）｜１７：（（０［０−９］｜１［０−４］）：（０［０−９］｜［１−４］［０−９］｜５［０−９］）｜１５：００））”
【０１７０】
上記の例では、秒の値の範囲である「００〜５９」に対応する正規表現を、実施の形態１に示した手順で生成するものとして、“０［０−９］｜［１−４］［０−９］｜５［０−９］”としたが、この正規表現は“［０−５］［０−９］”のようにより簡略な表記にすることもできる。時刻の中の属性で、分や秒の「００〜５９」のように出現頻度の高いパターンに対しては、定型の正規表現を磁気ディスク装置９２０に記憶しておき、必要に応じて読み出して使用することにより、正規表現の生成処理をより簡略化することができる。このような出現頻度の高いパターンの例としては、日付の「（０）１〜１２」、「（０）１〜３１」、時刻の「０〜１２」、「０〜２４」、「００〜５９」、ＩＰアドレスの「０〜２５５」など、「Ｖｉｍｉｎ〜Ｖｉｍａｘ」となるパターンが挙げられる。
【０１７１】
以下のように、時刻が１２時間表記の場合は、午前と午後とに分けて考えればよい。
【０１７２】
（例４−４）属性範囲条件：８：４５：００ＡＭ〜５：１５：００ＰＭ
このような属性範囲条件は以下のように考えられる。
属性範囲条件１：８：４５：００ＡＭ〜１１：５９：５９ＡＭ
属性範囲条件２：０：００：００ＰＭ〜５：１５：００ＰＭ
このように午前と午後とで個別に正規表現を生成した後で、正規表現結合部１０５が以下の通り正規表現を結合すればよい。
正規表現：“＜属性範囲条件１の正規表現＞｜＜属性範囲条件２の正規表現＞”
【０１７３】
ＩＰアドレスの場合は、４個の正の整数が区切り文字であるピリオド「．」で区切られており、左から順に上位の階層となっている。また、各階層の数値の値域は０〜２５５である。また、ＩＰｖ６のＩＰアドレスは、８個の１６進数値が区切り文字であるコロン「：」で区切られている。いずれの場合も、上位の階層から下位の階層に向かって領域を分割する手順を適用し、各階層の値については実施の形態１の手順を適用することにより、同様に正規表現を生成することができる。各階層は、０以上の整数、即ち、実施の形態１と同様の形式の属性値として処理することができる。
【０１７４】
（例４−５）属性範囲条件：１０．０．１．１〜１０．２．１００．２５４
【０１７５】
ステップＳ１０２において、演算部１０２は、この属性範囲条件を以下のように下位、中位、上位領域に分割できる。
下位領域：１０．０．１．１〜１０．０．２５５．２５５
中位領域：１０．１．０．０〜１０．１．２５５．２５５
上位領域：１０．２．０．０〜１０．２．１００．２５４
【０１７６】
ここから、同様に下位の階層に向かって処理を行う。即ち、ステップＳ１０４において、正規表現生成部１０４は、下位領域を、さらに以下のように分割できる。
下位領域：１０．０．１．１〜１０．０．１．２５５
中位領域：１０．０．２．０〜１０．０．２５５．２５５
【０１７７】
ステップＳ１０５において、正規表現生成部１０４は、上位領域を、さらに以下のように分割できる。
中位領域：１０．２．０．０〜１０．２．０．９９．２５５
上位領域：１０．２．１００．０〜１０．２．１００．２５４
【０１７８】
最終的に、ステップＳ１０６において、正規表現結合部１０５は、以下の通り正規表現を生成することができる。
正規表現：“１０￥．（（０￥．（１￥．（［１−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−５］｜２［０−４］［０−９］））｜（［２−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−５］｜２［０−４］［０−９］））￥．（［０−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−５］｜２［０−４］［０−９］））））｜（１￥．（［０−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−５］｜２［０−４］［０−９］））￥．（［０−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−５］｜２［０−４］［０−９］）））｜（２￥．（（［０−９］｜［１−９］［０−９］）￥．（［０−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−５］｜２［０−４］［０−９］））｜１００￥．（［０−９］｜［１−９］［０−９］｜１［０−９］［０−９］｜（２５［０−４］｜２［０−４］［０−９］）））））”
【０１７９】
小数は、整数部と小数部がピリオド「．」で区切られた数値である。正規表現の生成手順は、上位の階層である整数部、下位の階層である小数部の順に領域を分割する手順を適用し、整数部の値については実施の形態１の手順を適用し、小数部の値については実施の形態３の手順を適用することにより、同様に正規表現を生成することができる。
【０１８０】
（例４−６）属性範囲条件：１．４１４２〜６．６３
【０１８１】
ステップＳ１０２において、演算部１０２は、この属性範囲条件を以下のように下位、中位、上位領域に分割できる。ここで、第２階層は実施の形態３の形式の属性値なので、その最小値、最大値は桁数が同じ値の範囲で考える。即ち、下限値の第２階層の値が４桁なので、演算部１０２は、下位領域の上限値として４桁の数値の最大値を選択する。また、上限値の第２階層の値が２桁なので、演算部１０２は、上位領域の下限値として２桁の数値の最小値を選択する。
下位領域：１．４１４２〜１．９９９９
中位領域：２．００〜５．９９
上位領域：６．００〜６．６３
【０１８２】
最終的に、ステップＳ１０６において、正規表現結合部１０５は、以下の正規表現を生成することができる。
正規表現：“（１￥．（（４１４［２−９］｜４１［５−９］｜４［２−９］）｜（［５−９］）））｜（［２−５］￥．［０−９］）｜（６￥．（（［０−５］）｜（６［０−３］）））”
【０１８３】
なお、区切り文字が正規表現で使用されるメタキャラクタ（正規表現において特別な意味を持つ文字）の場合には、その区切り文字の直前にエスケープ文字（バックスラッシュ、又は、日本語Ｗｉｎｄｏｗｓ（登録商標）の環境では主に「￥」が使用される）を挿入しなければならない。そのようなメタキャラクタとしては、「｜」、「？」、「＊」、「＋」、「．」、「（」、「）」、「｛」、「｝」、「［」、「］」、「￥」、「＾」、「＄」、「＜」、「＞」がある。ただし、メタキャラクタの種類は、正規表現の処理系によって異なる場合がある。
【０１８４】
以上のように、本実施の形態に係る正規表現生成装置１００によれば、複数の属性値と区切り記号から構成される階層構造を持った属性の下限値、上限値、書式などを指定した属性範囲条件から、その下限値から上限値までの範囲に含まれる属性値を表現する文字列を照合するための正規表現を自動的に生成することができる。これにより、従来は正確に記述することが困難であった複雑な属性範囲条件を照合する正規表現を、特別な知識も試行錯誤も必要なく、容易に短時間で得ることができる。
【０１８５】
実施の形態５．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１８６】
本実施の形態は、既定の構文規則や書式に従って記述されたテキストデータの、特定の範囲に含まれる文字列を検索するための正規表現を生成する処理の流れを説明するものである。ここでは、従来のように検索対象として指定される特定の文字列だけではなく、下限値から上限値までの特定の範囲に含まれる属性値を表現する文字列が検索対象となる。
【０１８７】
図１３は、本実施の形態に係る正規表現生成装置１００の構成を示すブロック図である。
【０１８８】
図１３において、正規表現生成装置１００は、実施の形態１で説明した図１に示したものに加え、テキスト範囲条件入力部１０９を備える。正規表現生成装置１００は、実施の形態２と同様に、さらに、条件記憶部１０７、識別子入力部１０８を備えていてもよい。
【０１８９】
テキスト範囲条件入力部１０９は、テキスト範囲条件データを入力装置１５３から入力する。テキスト範囲条件データは、所定の構文規則に従って記述されたテキストの特定の領域を示すテキスト範囲条件のデータである。テキスト範囲条件によって、テキスト中の特定の範囲が指定される。例えば、テキストが電子メールであれば、テキスト範囲条件入力部１０９は、テキストの特定の領域として、電子メールの特定のヘッダフィールドを示すテキスト範囲条件データを入力することができる。また、例えば、テキストがＣＳＶなどのように区切り文字で複数のフィールドに区切られたものであれば、テキスト範囲条件入力部１０９は、テキストの特定の領域として、複数のフィールドのいずれかを示すテキスト範囲条件データを入力することができる。
【０１９０】
属性範囲条件入力部１０１は、属性値の書式として、属性値がテキスト範囲条件入力部１０９により入力されたテキスト範囲条件データが示す領域に含まれることを示す属性範囲条件データを入力する。
【０１９１】
正規表現生成部１０４は、さらに、テキスト範囲条件入力部１０９により入力されたテキスト範囲条件データが示す領域を正規表現で表すテキスト領域データ（以下、単に「正規表現」、又は「範囲」などという場合がある）を処理装置１５２で生成する。
【０１９２】
正規表現結合部１０５は、属性範囲条件入力部１０１により入力された属性範囲条件データが示す書式に基づいて、正規表現生成部１０４により生成された下位領域データと上位領域データと中位領域データとテキスト領域データとを結合して、属性値を含む前記テキストの特定の領域を正規表現で表す正規表現データを生成する。
【０１９３】
正規表現生成装置１００が、条件記憶部１０７、識別子入力部１０８を備えている場合には、条件記憶部１０７は、複数の属性範囲条件データと複数のテキスト範囲条件データとを予め記憶装置１５１に記憶しておく。また、条件記憶部１０７は、各属性範囲条件データと各テキスト範囲条件データとの組み合わせを一意の識別子と対応付けて予め記憶装置１５１に記憶しておく。識別子入力部１０８は、任意の識別子を入力装置１５３から入力する。属性範囲条件入力部１０１は、識別子入力部１０８により入力された識別子に対応付けて条件記憶部１０７により記憶された組み合わせの属性範囲条件データを入力する。同様に、テキスト範囲条件入力部１０９は、識別子入力部１０８により入力された識別子に対応付けて条件記憶部１０７により記憶された組み合わせのテキスト範囲条件データを入力する。
【０１９４】
図１４は、本実施の形態に係る正規表現生成方法を示すフローチャートである。図１４のフローチャートに示すフローは、正規表現生成装置１００を実現するコンピュータ上で実行されるプログラム（正規表現生成プログラム）の処理手順に相当する。この処理手順において、正規表現生成プログラムは、以下に示す各処理をコンピュータに実行させる。
【０１９５】
正規表現生成装置１００の利用者がキーボード９０２やマウス９０３でテキスト範囲条件データを指定すると、テキスト範囲条件入力部１０９は、そのテキスト範囲条件データをキーボード９０２やマウス９０３から入力する（ステップＳ９０１：テキスト範囲条件入力処理）。また、正規表現生成装置１００の利用者がキーボード９０２やマウス９０３で、そのテキスト範囲条件データが示すテキストの領域に属性値が含まれることを示す属性範囲条件データを指定すると、属性範囲条件入力部１０１は、その属性範囲条件データをキーボード９０２やマウス９０３から入力する（ステップＳ９０２：属性範囲条件入力処理）。ステップＳ９０２の後は、実施の形態１で説明した図４のフローチャートと同様に、ステップＳ１０２の処理が実行される。
【０１９６】
正規表現生成部１０４は、ステップＳ９０１でテキスト範囲条件入力部１０９により入力されたテキスト範囲条件データが示すテキストの領域を正規表現で表すテキスト領域データをＣＰＵ９１１で生成する（ステップＳ９０３：正規表現生成処理の一部）。ステップＳ９０３の後は、実施の形態１で説明した図４のフローチャートと同様に、ステップＳ１０３〜Ｓ１０５の処理が実行される。
【０１９７】
正規表現結合部１０５は、ステップＳ９０２で属性範囲条件入力部１０１により入力された属性範囲条件データが示す書式に基づいて、ステップＳ９０３、Ｓ１０３〜Ｓ１０５で正規表現生成部１０４により生成されたテキスト領域データと下位領域データと上位領域データと中位領域データとをＣＰＵ９１１で結合して（ステップＳ１０３で中位領域データが生成されなかった場合には、テキスト領域データと下位領域データと上位領域データのみを結合することになる）、属性値記憶部１０３により記憶された下限値から上限値までの属性値だけでなく、その属性値を含むテキストの領域を正規表現で表す正規表現データを生成する（ステップＳ９０４：正規表現結合処理）。ステップＳ９０４の後は、実施の形態１で説明した図４のフローチャートと同様に、ステップＳ１０７の処理が実行される。
【０１９８】
このように、本実施の形態において、正規表現生成装置１００は、既定の構文規則に従って記述されたテキストデータの特定の領域を選択するテキスト範囲条件と、属性値の値域に含まれる特定の範囲を選択する属性範囲条件を入力とし、これらを、上記領域の中から属性範囲条件に合致する属性値を検出するための正規表現に変換する検索条件生成方式、又は、この方式を計算機上で実行するための検索条件生成プログラムを実装するものである。この方式では、テキスト範囲条件と等価な正規表現と、属性範囲条件と等価な正規表現を生成し、さらに、それらの正規表現を結合する。
【０１９９】
上記検索条件生成方式では、例えば、電子メールの特定のヘッダフィールドを選択するテキスト範囲条件と、属性範囲条件を入力し、それら条件を正規表現に変換する。また、例えば、１行が既定の区切り文字によって複数のフィールドに分割されているテキストデータの特定のフィールドを選択するテキスト範囲条件と、属性範囲条件とを入力し、それら条件を正規表現に変換する。
【０２００】
また、正規表現生成装置１００は、検索条件から正規表現への変換規則を記憶するための領域を記憶装置１５１内に設けておいてもよい。この場合、属性範囲条件入力部１０１、テキスト範囲条件入力部１０９、識別子入力部１０８が、属性範囲条件とテキスト範囲条件のいずれか又はその両方と、識別子を入力として受け付ける。上記領域には、条件記憶部１０７が、例えば、識別子と、属性値の形式によって異なる属性範囲条件を正規表現に変換するための変換規則の組と、識別子と、テキストデータの構文によって異なるテキスト範囲条件を正規表現に変換するための変換規則の組のいずれか、又はその両方を記憶しておく。そして、正規表現生成部１０４や正規表現結合部１０５は、入力された識別子と関連付けられた変換規則を上記領域から取り出し、変換規則に従って入力済の属性範囲条件又はテキスト範囲条件を正規表現に変換する。属性範囲条件入力部１０１、テキスト範囲条件入力部１０９、識別子入力部１０８が、属性範囲条件又はテキスト範囲条件を正規表現に変換するための変換規則と識別子との組の入力を受け付け、条件記憶部１０７が、入力された変換規則と識別子の組を上記領域に記憶するようにしてもよい。
【０２０１】
以下、正規表現を生成する処理の流れを、例を交えて説明する。
【０２０２】
初めに、既定の構文規則や書式を持つテキストの例を示す。第１の例は、電子メールである。電子メールは、ヘッダフィールドの書式が、ＲＦＣ（Ｒｅｑｕｅｓｔ・Ｆｏｒ・Ｃｏｍｍｅｎｔ）２８２２などにより定められている。ヘッダフィールドの１項目は、基本的に、フィールド名、フィールドの値、改行（ＣＲＬＦ）から構成されている。第２の例は、ＣＳＶファイルである。ＣＳＶファイルは、複数のフィールドの値をカンマで区切って記述したテキストファイルで、表形式のデータを表現するために利用されることが多い。類似の形式として、ＴＳＶ（Ｔａｂ・Ｓｅｐａｒａｔｅｄ・Ｖａｌｕｅｓ）といわれる区切り文字にタブを使用した形式や、区切り文字にスペースを使用した形式などがあるが、いずれも、区切り文字で複数のフィールドに区切られたテキストである。
【０２０３】
上記のようなテキスト中の、特定の範囲に含まれる文字列を検索するための正規表現は、テキストの書式ごとに異なるテキスト中の範囲を特定するための正規表現と、その範囲内の文字列を検索するための固定キーワードや正規表現とを組み合わせることにより実現することができる。そのために、本実施の形態では、正規表現生成装置１００が備える記憶装置１５１内の参照可能な記憶領域に、書式と範囲を特定するための正規表現を予め記憶しておくことが望ましい。この場合、正規表現生成装置１００の入力は、属性範囲条件に示される書式の指定と、テキスト範囲条件に示される検索対象となる範囲の指定と、指定の範囲内を検索する正規表現となる。正規表現生成装置１００は、それらの入力がなされると、書式と検索対象とする範囲の指定から、対応する範囲を特定するための正規表現を生成し、さらに生成した正規表現と、範囲内を検索する正規表現とを結合して出力する。
【０２０４】
また、テキスト中の特定の範囲を対象に、実施の形態１〜４に示したような属性範囲条件を指定した検索を行うための正規表現を生成する処理は、テキストの範囲を特定するための正規表現を生成するとともに、実施の形態１〜４に示した手順に従って属性範囲条件に対応する正規表現を生成し、それらを結合することにより実現することができる。
【０２０５】
電子メールの例を示す。電子メールのヘッダフィールドの構文は以下の通りである。
＜ヘッダフィールド名＞：＜属性値＞＜改行（ＣＲＬＦ）＞
【０２０６】
また、複数行にまたがる属性値の場合の構文は以下の通りである。電子メールのヘッダフィールドにおいて、行の先頭が半角空白文字かタブであった場合は、その行は直前の行の続きであることを意味している。
＜ヘッダフィールド名＞：＜属性値＞＜改行（ＣＲＬＦ）＞
＜半角空白又はタブ＞＜属性値＞＜改行（ＣＲＬＦ）＞
・・・・・・
【０２０７】
このとき、電子メールのヘッダフィールドのテキスト範囲条件の正規表現は、以下の形になる。
（１）ヘッダフィールドが１行の場合
正規表現：“（＾｜￥ｎ）＜ヘッダフィールド名＞：［＾￥ｎ］＊＜属性値の正規表現＞”
（２）ヘッダフィールドが複数行にわたる場合
正規表現：“（＾｜￥ｎ）＜ヘッダフィールド名＞：［＾￥ｎ］＊（＜属性値の正規表現＞｜（￥ｎ（￥ｓ｜￥ｔ）＋［＾￥ｎ］＊）＋＜属性値の正規表現＞）”
ここでは、「￥ｎ」は改行、「￥ｓ」は半角空白、「￥ｔ」はタブを意味するものとする。
【０２０８】
例えば、電子メールの表題（Ｓｕｂｊｅｃｔ）に文字列「メール」を含む属性値を検索したい場合、正規表現生成装置１００の入力は、次の情報を含んでいればよい。
（ａ）文書の形式＝「電子メールのヘッダフィールド」
（ｂ）検索対象の範囲（ヘッダフィールド名）＝「Ｓｕｂｊｅｃｔ」
（ｃ）範囲の検索条件（正規表現）＝「メール」
これらの条件を指定することが可能であれば、その指定の方法は問わないが、例えば、テキスト範囲条件入力部１０９が、テキスト範囲条件として、（ａ）文書の形式と（ｂ）検索対象の範囲を指定し、属性範囲条件入力部１０１が、属性範囲条件として、（ｃ）範囲の検索条件を指定すればよい（このとき、属性範囲条件入力部１０１は、範囲の検索条件を指定することで、属性値がテキスト範囲条件データに示された範囲に含まれることも示したこととなる）。
【０２０９】
上記の入力を受けて、正規表現生成部１０４と正規表現結合部１０５とで、以下のように、上記の電子メールのヘッダフィールドのテキスト範囲条件の正規表現中の＜ヘッダフィールド名＞を「Ｓｕｂｊｅｃｔ」に、＜属性値の正規表現＞を「メール」に置き換えた正規表現を出力する。
“（＾｜￥ｎ）Ｓｕｂｊｅｃｔ：［＾￥ｎ］＊（（メール）｜（￥ｎ（￥ｓ｜￥ｔ）＋［＾￥ｎ］＊）＋（メール））”
ここで、検索対象のヘッダフィールドが、複数行にわたることがないことがわかっていれば、単に以下の正規表現を出力するようにしてもよい。
“（＾｜￥ｎ）Ｓｕｂｊｅｃｔ：［＾￥ｎ］＊（メール）”
【０２１０】
電子メールの送信日時を表すヘッダフィールド（Ｄａｔｅ）のような対象に、その下限値と上限値とを指定した検索を実行するための正規表現を生成する手順を示す。このときの正規表現生成装置１００の入力は、以下の通りである。
（ａ）文書の形式＝「電子メールのヘッダフィールド」
（ｂ）検索対象の範囲（ヘッダフィールド名）＝「Ｄａｔｅ」
（ｃ）検索条件（下限値と上限値）＝「２００５／１０／１〜２００６／９／３１」
例えば、テキスト範囲条件入力部１０９が、テキスト範囲条件として、（ａ）文書の形式と（ｂ）検索対象の範囲を指定し、属性範囲条件入力部１０１が、属性範囲条件として、（ｃ）範囲の検索条件を指定する。
【０２１１】
また、属性範囲条件入力部１０１が、属性範囲条件として、以下の条件も指定する。
（ｄ）属性の種類＝「日付」
（ｅ）区切り文字と階層の順序＝「日  月  年」（区切り文字が空白文字（厳密には、半角空白）で、右から順に上位とする）
（ｆ）階層「月」の値域＝「Ｊａｎ〜Ｄｅｃ」
【０２１２】
ここから、正規表現生成部１０４は、テキスト範囲条件の正規表現と、属性範囲条件の正規表現を以下のように生成することができる。
範囲：“（＾｜￥ｎ）＜ヘッダフィールド名＞：［＾￥ｎ］＊＜属性値の正規表現＞”
属性範囲（属性値の正規表現）：“（（［１−９］｜［１２］［０−９］｜３［０−１］）  （Ｏｃｔ｜Ｎｏｖ｜Ｄｅｃ）  ２００５）｜（（［１−９］｜［１２］［０−９］｜３［０−１］）  （Ｊａｎ｜Ｆｅｂ｜Ｍａｒ｜Ａｐｒ｜Ｍａｙ｜Ｊｕｎ｜Ｊｕｌ｜Ａｕｇ｜Ｓｅｐ）  ２００６）”
最後に、正規表現結合部１０５が、これらを結合すると、所望の正規表現を得ることができる。
【０２１３】
ＣＳＶ形式のテキストの場合でも、正規表現の生成手順は電子メールの場合と同様である。ＣＳＶ形式のテキストの各行のｉ番目とｉ＋１番目のカンマに挟まれた範囲を対象に、正規表現によって検索する場合、範囲を特定するための正規表現は、以下の形式になる。
“（＾｜￥ｎ）（［＾，］＊，）｛ｉ｝［＾，］＊＜属性値の正規表現＞”
【０２１４】
このときの、正規表現生成装置１００の入力としては、次の情報が含まれていればよい。
（ａ）文書の形式＝「ＣＳＶ」
（ｂ）検索対象の範囲（フィールドの番号）
（ｃ）範囲の検索条件（正規表現）
例えば、テキスト範囲条件入力部１０９が、テキスト範囲条件として、（ａ）文書の形式と（ｂ）検索対象の範囲を指定し、属性範囲条件入力部１０１が、属性範囲条件として、（ｃ）範囲の検索条件を指定する。
【０２１５】
正規表現には、各フィールドの値がダブルクォーテーション「”」で囲まれているものもある。各フィールドの値がダブルクォーテーションで囲まれているとき、値にカンマが含まれる場合や、値にダブルクォーテーションが２個連続して含まれる場合もある。このときのテキスト範囲の正規表現は以下の形式となる（左端と右端のダブルクォーテーションはこれまでに記述したものと同様、正規表現を強調表示するものであり、正規表現の一部ではない）。
“（＾｜￥ｎ）（“（［＾”］｜”“）＊”，）｛ｉ｝”（［＾”］｜”“）＊＜属性値の正規表現＞”
【０２１６】
ＴＳＶ形式の場合は、上記のテキスト範囲の正規表現の区切り文字であるカンマ「，」を、以下の通りタブ（「￥ｔ」で表す）に置き換えるだけでよい。
“（＾｜￥ｎ）（“（［＾”］｜”“）＊”￥ｔ）｛ｉ｝”（［＾”］｜”“）＊＜属性値の正規表現＞”
【０２１７】
スペース区切り形式のテキストの場合は、上記のテキスト範囲の正規表現の区切り文字であるカンマ「，」やタブを、以下の通り半角空白（「￥ｓ」で表す）に置き換えるだけでよい。
“（＾｜￥ｎ）（“（［＾”］｜”“）＊”￥ｓ）｛ｉ｝”（［＾”］｜”“）＊＜属性値の正規表現＞”
【０２１８】
また、区切り文字の連続を１個の区切り文字と見なす場合は、単体の区切り文字を“＜区切り文字＞＋”の形式に変更するだけでよい。
【０２１９】
実施の形態１や３において、属性範囲条件の正規表現の前に除外文字指定“［＾ｖ１−ｖｑ］”という表現を追加することにより、属性範囲条件を厳密に照合する方法を示した。このような属性範囲条件の正規表現と、ＣＳＶ形式やＴＳＶ形式などのフィールドが区切り文字で区切られたテキストを検索するテキスト範囲条件の正規表現を結合する場合には、直前の除外文字指定と合わせて、除外文字指定に区切り文字も含めて記述する。即ち、以下のように正規表現を構成する。
正規表現：“（＾｜￥ｎ）（［＾＜区切り文字＞］＊＜区切り文字＞）｛ｉ｝［＾ｖ１−ｖｑ＜区切り文字＞］＊＜属性値の正規表現＞”
これにより、“［＾ｖ１−ｖｑ］”に区切り文字自体が照合されてしまうのを防ぐことができる。
【０２２０】
以上のように、本実施の形態に係る正規表現生成装置１００によれば、既定の構文・書式に従って記述されたテキストの中の、特定の範囲を指定するテキスト範囲条件と、正規表現又は属性範囲条件から、その範囲に含まれる文字列を照合するための正規表現を自動的に生成することができる。これにより、従来は正確に記述することが困難であった複雑な属性範囲条件を照合する正規表現を、特別な知識も試行錯誤も必要なく、容易に短時間で得ることができる。
【０２２１】
以上、本発明の実施の形態について説明したが、これらのうち、２つ以上の実施の形態を組み合わせて実施しても構わない。あるいは、これらのうち、１つの実施の形態を部分的に実施しても構わない。あるいは、これらのうち、２つ以上の実施の形態を部分的に組み合わせて実施しても構わない。
【図面の簡単な説明】
【０２２２】
【図１】実施の形態１、３、４に係る正規表現生成装置の構成を示すブロック図である。
【図２】各実施の形態における正規表現生成装置の外観の一例を示す図である。
【図３】各実施の形態における正規表現生成装置のハードウェア資源の一例を示す図である。
【図４】実施の形態１、３、４に係る正規表現生成方法を示すフローチャートである。
【図５】実施の形態１における図４のステップＳ１０２の詳細を示すフローチャートである。
【図６】実施の形態１における図４のステップＳ１０４の詳細を示すフローチャートである。
【図７】実施の形態１における図４のステップＳ１０５の詳細を示すフローチャートである。
【図８】実施の形態２に係る正規表現生成装置の構成を示すブロック図である。
【図９】実施の形態２に係る正規表現生成方法を示すフローチャートである。
【図１０】実施の形態３における図４のステップＳ１０２の詳細を示すフローチャートである。
【図１１】実施の形態３における図４のステップＳ１０４の詳細を示すフローチャートである。
【図１２】実施の形態３における図４のステップＳ１０５の詳細を示すフローチャートである。
【図１３】実施の形態５に係る正規表現生成装置の構成を示すブロック図である。
【図１４】実施の形態５に係る正規表現生成方法を示すフローチャートである。
【符号の説明】
【０２２３】
１００  正規表現生成装置、１０１  属性範囲条件入力部、１０２  演算部、１０３  属性値記憶部、１０４  正規表現生成部、１０５  正規表現結合部、１０６  出力部、１０７  条件記憶部、１０８  識別子入力部、１０９  テキスト範囲条件入力部、１５１  記憶装置、１５２  処理装置、１５３  入力装置、１５４  出力装置、９０１  表示装置、９０２  キーボード、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ装置、９１０  システムユニット、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信ボード、９２０  磁気ディスク装置、９２１  オペレーティングシステム、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群、９４０  インターネット、９４１  ゲートウェイ、９４２  ＬＡＮ。
【図１】
2008146162.tif 000003
【図２】
2008146162.tif 000004
【図３】
2008146162.tif 000005
【図４】
2008146162.tif 000006
【図５】
2008146162.tif 000007
【図６】
2008146162.tif 000008
【図７】
2008146162.tif 000009
【図８】
2008146162.tif 000010
【図９】
2008146162.tif 000011
【図１０】
2008146162.tif 000012
【図１１】
2008146162.tif 000013
【図１２】
2008146162.tif 000014
【図１３】
2008146162.tif 000015
【図１４】
2008146162.tif 000016