(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024172584
(43)【公開日】2024-12-12
(54)【発明の名称】修正装置、修正方法及び修正プログラム
(51)【国際特許分類】
G06F 8/51 20180101AFI20241205BHJP
G06F 8/30 20180101ALI20241205BHJP
【FI】
G06F8/51
G06F8/30
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2023090383
(22)【出願日】2023-05-31
(71)【出願人】
【識別番号】000004226
【氏名又は名称】日本電信電話株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】千田 忠賢
【テーマコード(参考)】
5B081
5B376
【Fターム(参考)】
5B081CC24
5B376BC23
5B376DA28
(57)【要約】
【課題】抽出タスクに用いられる正規表現を修正し、かつその修正結果は全ての例を満たすことを保証すること。
【解決手段】修正装置10は、特定部151及び修正部152を有する。特定部151は、正例に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する。修正部152は、入力された第1の正規表現を、正例に含まれる文字列を受理し、負例に含まれる文字列を受理せず、キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
第1の集合に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する特定部と、
入力された第1の正規表現を、前記第1の集合に含まれる文字列を受理し、第2の集合に含まれる文字列を受理せず、前記キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する修正部と、
を有することを特徴とする修正装置。
【請求項2】
前記特定部は、前記第1の集合に含まれる第1の記号と第2の記号との間の文字列を前記キャプチャ対象の文字列として特定することを特徴とする請求項1に記載の修正装置。
【請求項3】
前記修正部は、前記第2の正規表現の候補のうち、前記第1の正規表現との間の編集距離が最小である正規表現を、前記第2の正規表現に決定することを特徴とする請求項1に記載の修正装置。
【請求項4】
前記修正部は、前記第1の正規表現における範囲文字をプレースホルダに置換し、さらに前記プレースホルダを、前記キャプチャ対象の文字列を含み、前記キャプチャ対象の文字列以外の文字列を含まない範囲文字に置換することを特徴とする請求項1に記載の修正装置。
【請求項5】
修正装置によって実行される修正方法であって、
第1の集合に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する特定工程と、
入力された第1の正規表現を、前記第1の集合に含まれる文字列を受理し、第2の集合に含まれる文字列を受理せず、前記キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する修正工程と、
を含むことを特徴とする修正方法。
【請求項6】
第1の集合に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する特定ステップと、
入力された第1の正規表現を、前記第1の集合に含まれる文字列を受理し、第2の集合に含まれる文字列を受理せず、前記キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する修正ステップと、
をコンピュータに実行させることを特徴とする修正プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、修正装置、修正方法及び修正プログラムに関する。
【背景技術】
【0002】
正規表現は文字列のパターンを表す記法として世の中で広く利用されている。世の中では文字列が特定のパターンに一致するかどうか確認する場面(これを今後「所属判定」と呼ぶ)や特定のパターンに一致する部分文字列を抽出する場面(これを今後「抽出タスク」と呼ぶ)が多々存在する。そのため世の中で利用されているプログラミング言語の多くはこれらを実現する機能を標準ライブラリ(正規表現エンジン)として提供している。
【0003】
正規表現はその簡潔さや便利さから世の中で広く受け入れられているものの、利用者が意図した正規表現を正しく書くことは難しいことが知られている。すなわち、本来利用者が求めているものと異なるパターンを表す正規表現を書いてしまうことがある。
【0004】
求めているものと異なる正規表現を書いた場合、その正規表現が利用されているプログラムでは間違った一致判定や間違った部分文字列を抽出してしまう可能性がある。意図しない挙動はプログラムのバグや脆弱性となりうるため、このようなことは望ましくなく解決すべき課題として正規表現を自動で修正する技術に関する研究が行われている。
【0005】
例を用いて正規表現を修正する技術が知られている(例えば、非特許文献1、2、3及び4を参照)。これらの技術は例のみ、もしくは正規表現と例を受け取り、例を全て満たすような正規表現を出力する技術である。
【0006】
また、抽出タスク用の正規表現を例から合成する技術が知られている(例えば、非特許文献5及び6を参照)。これらの技術は遺伝的アルゴリズムを用いて例をできる限り多く満たすような正規表現を合成する技術である。
【先行技術文献】
【非特許文献】
【0007】
【非特許文献1】Mina Lee, Sunbeom So, Hakjoo Oh, Synthesizing Regular Expressions from Examples for Introductory Automata Assignments,
【非特許文献2】RONG PAN, QINHEPING HU, GAOWEI XU, LORIS D’ANTONI, Automatic Repair of Regular Expressions
【非特許文献3】Yeting Li, Zhiwu Xu, Jialun Cao, Haiming Chen, Tingjian Ge, Shing-Chi Cheung, FlashRegex: Deducing Anti-ReDoS Regexes from Examples
【非特許文献4】Nariyoshi Chida, Tachio Terauchi, Repairing DoS Vulnerability of Real-World Regexes
【非特許文献5】Alberto Bartoli, Giorgio Davanzo, Andrea De Lorenzo, Eric Medvet, and Enrico Sorio, Automatic Synthesis of Regular Expressions from Examples
【非特許文献6】Alberto Bartoli, Andrea De Lorenzo, Eric Medvet, and Fabiano Tarlao, Inference of Regular Expressions for Text Extraction from Examples
【非特許文献7】Yuto Sakuma, Yasuhiko Minamide, Andrei Voronkov, Translating regular expression matching into transducers
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、従来の技術では、抽出タスクに用いられる正規表現を修正し、かつその修正結果は全ての例を満たすことを保証することができない場合がある。
【0009】
例えば、非特許文献1等に記載の、例を用いて正規表現を修正する技術は、所属判定用の正規表現の修正を対象としたものであり、抽出タスク用の正規表現を対象としたものではない。
【0010】
また、非特許文献5等に記載の、遺伝的アルゴリズムを用いて正規表現を合成する技術は、修正結果が全ての例を満たすことは保証していない。
【課題を解決するための手段】
【0011】
上述した課題を解決し、目的を達成するために、修正装置は、第1の集合に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する特定部と、入力された第1の正規表現を、前記第1の集合に含まれる文字列を受理し、第2の集合に含まれる文字列を受理せず、前記キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する修正部と、を有することを特徴とする。
【発明の効果】
【0012】
本発明によれば、抽出タスクに用いられる正規表現を修正し、かつその修正結果は全ての例を満たすことを保証することができる。
【図面の簡単な説明】
【0013】
【
図1】
図1は、第1の実施形態の修正装置の構成例を示す図である。
【
図4】
図4は、正規表現エンジンの非決定的な振る舞いを説明する図である。
【
図5】
図5は、正規表現エンジンの非決定的な振る舞いによる抽出結果の例を示す図である。
【
図6】
図6は、正規表現エンジンの決定的な振る舞いを説明する図である。
【
図8】
図8は、入力される情報の一例を示す図である。
【
図17】
図17は、修正装置の処理の流れを示すフローチャートである。
【
図18】
図18は、プログラムを実行するコンピュータの一例を示す図である。
【発明を実施するための形態】
【0014】
以下に、本願に係る修正装置、修正方法及び修正プログラムの実施形態を図面に基づいて詳細に説明する。なお、本発明は、以下に説明する実施形態により限定されるものではない。
【0015】
[正規表現について]
正規表現は、バッカスナウア記法(BNF:Backus Naur Form)によって定義された構文に従うものとする(参考URL:https://tc39.es/ecma262/)。
【0016】
与えられた文字列が受理されるか拒否されるかを判定するために用いられる正規表現を、所属判定用正規表現と呼ぶ。例えば、所属判定用正規表現は、メールアドレスを入力するフォームをもつWebアプリケーション等において、利用者がそのフォームに入力した文字列がメールアドレスの構文に従っているかどうか判定する場面等で用いられる。
【0017】
また、与えられた文字列から特定の部分文字列を抽出する用途で利用される正規表現を抽出タスク用正規表現と呼ぶ。例えば、抽出タスク用正規表現は、URLからホスト名を抽出する際に用いられる。
【0018】
[第1の従来技術]
図19を用いて、従来の例を用いて正規表現を修正する技術(以下、第1の従来技術)を説明する。第1の従来技術は、例えば、非特許文献1、2、3及び4に記載されている。
【0019】
図19に示すように、第1の従来技術における修正装置10aには、正規表現r、正例P、負例Nが入力される。正例及び負例は文字列の集合である。修正装置10aは、正例の文字列を受理し、負例の文字列を受理しないように、入力された正規表現を修正する。
【0020】
図19に示すように、修正装置10aは、入力された正規表現rをr´に修正する。修正後の正規表現r´は、「ab」及び「c」を受理し、「d」を受理しない。なお、「[^d]*」は、「d」を含まない長さ0以上の文字列を受理する正規表現である。
【0021】
また、r´は、正例の文字列を受理し、負例の文字列を受理しない正規表現のうち、rとの編集距離が最小の正規表現である。
【0022】
図20は、編集距離を説明する図である。2つの正規表現r
1及びr
2の編集距離は次のように定義される。
(1)それぞれの正規表現をAbstract Syntax Tree(AST)表記にする。
(2)それぞれのAST間で異なる頂点の数の合計値が編集距離となる。
【0023】
第1の従来技術では、正規表現のキャプチャによって抽出すべき箇所を例(例えば、正例)に明記することができない。また、仮にキャプチャによって抽出すべき箇所を例に明記できたとしても、第1の従来の技術では明記した箇所が適切に抽出される保証はない。
【0024】
[第2の従来技術]
また、非特許文献5及び6には、遺伝的アルゴリズムを用いて例をできる限り多く満たすような正規表現を合成する技術(以下、第2の従来技術)が記載されている。第2の従来技術では、
図21に示すように、第2の従来技術では、正規表現のキャプチャによって抽出すべき箇所を例に明記することができる。
図21は、従来の修正装置を示す図である。
【0025】
第2の従来技術における修正装置10bは、抽出すべき箇所が明記された例を基に、「AB(C|D|E)」のようなキャプチャを含む正規表現を出力する。
【0026】
例を用いて正規表現を修正する技術が知られている(例えば、非特許文献1、2、3及び4を参照)。これらの技術は例のみ、もしくは正規表現と例を受け取り、例を全て満たすような正規表現を出力する技術である。
【0027】
また、抽出タスク用の正規表現を例から合成する技術が知られている(例えば、非特許文献5及び6を参照)。これらの技術は遺伝的アルゴリズムを用いて例をできる限り多く満たすような正規表現を合成する技術である。
【0028】
しかしながら、第2の従来技術では、例に示された箇所が正しく抽出されるとは限らない。例えば、
図21の例では、「ABC」が抽出されるか、「ABD」が抽出されるか、「ABE」が抽出されるかが定まらない。
【0029】
[第1の実施形態成]
第1の実施形態は、従来技術の課題を解決することを目的とする。すなわち、第1の実施形態によれば、修正後の正規表現が、例に示された箇所を正しく抽出する。
【0030】
図1を用いて、第1の実施形態の修正装置の構成を説明する。
図1は、第1の実施形態の修正装置の構成例を示す図である。
【0031】
図2に示すように、修正装置10は、通信部11、入力部12、出力部13、記憶部14及び制御部15を有する。
【0032】
通信部11は、ネットワークを介して他の装置との間でデータ通信を行う。例えば、通信部11はNIC(Network Interface Card)である。
【0033】
入力部12は、データの入力を受け付ける。例えば、入力部12は、例えばマウス及びキーボード等の入力装置と接続されるインタフェースである。
【0034】
出力部13は、データを出力する。出力部13は、例えばディスプレイ及びスピーカ等の出力装置と接続されるインタフェースである。
【0035】
記憶部14は、HDD(Hard Disk Drive)、SSD(Solid State Drive)、光ディスク等の記憶装置である。なお、記憶部14は、RAM(Random Access Memory)、フラッシュメモリ、NVSRAM(Non Volatile Static Random Access Memory)等のデータを書き換え可能な半導体メモリであってもよい。記憶部14は、修正装置10で実行されるOS(Operating System)及び各種プログラムを記憶する。
【0036】
記憶部14は、テンプレート情報141を記憶する。テンプレート情報141は、正規表現又はテンプレートにおける構文の集合である。テンプレート情報141に含まれる構文は、後述する処理において範囲文字又はホールと置換される。例えば、テンプレート情報121は、「□□, □|□, □*, (□), \i, (?=□), (?!□), (?<=□), (?<!□)」である。ただし、「□」はホールである。ホール及びテンプレートについては後述する。
【0037】
制御部15は、修正装置10全体を制御する。制御部15は、例えば、CPU(Central Processing Unit)、MPU(Micro Processing Unit)、GPU(Graphics Processing Unit)等の電子回路や、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)等の集積回路である。
【0038】
また、制御部15は、各種の処理手順を規定したプログラム及び制御データを格納するための内部メモリを有し、内部メモリを用いて各処理を実行する。また、制御部15は、各種のプログラムが動作することにより各種の処理部として機能する。例えば、制御部15は、特定部151及び修正部152として機能する。
【0039】
特定部151は、正例に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する。また、修正部152は、入力された第1の正規表現を、正例に含まれる文字列を受理し、負例に含まれる文字列を受理せず、キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する。
【0040】
特定部151及び修正部152の処理について詳細に説明する。まず、修正装置10は、正規表現、正例、負例の入力を受け付ける。正例及び負例は文字列の集合である。
【0041】
修正部152は、入力された第1の正規表現を修正し、正例及び負例を満たす第2の正規表現を出力する。
【0042】
図2を用いて、本実施形態における正例を説明する。
図2は、正例について説明する図である。
図2に示すように、正規表現「ab(cd)
1ef」は、キャプチャ「(cd)
1」を含む。
【0043】
また、正例は、第1の記号(特殊な左かっこ(Unicode:U+2987))と添え字付きの第2の記号(特殊な右かっこ(Unicode:U+2988))で囲まれた部分を含む場合がある。この部分が、キャプチャ対象の文字列である。添え字は、キャプチャ対象の文字列を抽出するキャプチャの位置(何番目のキャプチャであるか)を示す。なお、ここでは、「<」及び「>」がそれぞれ第1の記号及び第2の記号を表すものとする。また、第1の記号、第2の記号及び添え字を、注釈と呼ぶ場合がある。
【0044】
このように、本実施形態では、正例にキャプチャ対象の文字列及びキャプチャの位置が注釈により指定される。特定部151は、正例に含まれる第1の記号と第2の記号との間の文字列をキャプチャ対象の文字列として特定する。
【0045】
キャプチャ対象の文字列及びキャプチャの位置が指定された正例を受理し、かつ指定された文字列を指定された位置のキャプチャによって抽出する正規表現は、当該正例を満たす。
【0046】
キャプチャ対象の文字列及びキャプチャの位置が指定された正例を受理しない正規表現は、当該正例を満たさない。
【0047】
キャプチャ対象の文字列及びキャプチャの位置が指定された正例を受理する正規表現であっても、指定された文字列を指定された位置のキャプチャによって抽出しない正規表現は、当該正例を満たさない。
【0048】
図2に示すように、正規表現「ab(cd)
1ef」は、正例「ab<cd>
1ef」を満たす。すなわち、正規表現「ab(cd)
1ef」は、正例「ab<cd>
1ef」を受理し、かつ1番目のキャプチャにより「cd」を抽出する。
【0049】
一方、
図2に示すように、正規表現「ab(cd)
1ef」は、正例「a<bcd>
1ef」を満たさない。すなわち、正規表現「ab(cd)
1ef」は、正例「a<bcd>
1ef」を受理するものの、1番目のキャプチャにより「bcd」を抽出しない。
【0050】
図3を用いて、本実施形態における負例を説明する。
図3は、負例について説明する図である。負例を受理しない正規表現は、当該負例を満たすものとする。また、負例を受理する正規表現は、当該負例を満たさないものとする。
【0051】
図3に示すように、正規表現「ab(cd)
1ef」は、負例「abcdef」を満たさない。すなわち、正規表現「ab(cd)
1ef」は、負例「abcdef」を受理する。ただし、負例「abcdef」には、1番目のキャプチャにより「cd」が抽出されることは示されていない。
【0052】
また、
図3に示すように、正規表現「ab(cd)
1ef」は、負例「abcd」を満たす。すなわち、正規表現「ab(cd)
1ef」は、負例「abcd」を拒否する。
【0053】
なお、キャプチャ対象の文字列及びキャプチャの位置が指定された負例は、修正装置10に入力されないものとする。例えば、そのような入力はエラーとして扱われる。キャプチャ対象の文字列およびキャプチャの位置が指定されていない正例は、修正装置10に入力されてもよい点に注意する。そのような場合、修正装置10に対し、その文字列からは何も抽出しないような正規表現を求めていることを意図する。
【0054】
ここで、引用文献4では、正規表現エンジンの振る舞いが
図4のように定義されている。
図4は、正規表現エンジンの非決定的な振る舞いを説明する図である。
【0055】
rは正規表現である。wは入力文字列である。pは入力文字列上の位置である。Γは環境であり、キャプチャにより抽出した文字を添え字と対応付けて記録する関数である。
【0056】
図4の定義には、矢印の左側の状態で正規表現エンジンを動かした場合、矢印の右側のn組のいずれかに状態が遷移することが示されている。つまり、非特許文献4に記載の技術では、n組の結果のうち、どれが最終結果になるかが不明である。すなわち、正規表現エンジンが非決定的な振る舞いをする。
【0057】
図5は、正規表現エンジンの非決定的な振る舞いによる抽出結果の例を示す図である。
図5に示すように、正規表現エンジンが非決定的な振る舞いをすると定義した場合、キャプチャによる抽出結果が複数得られる。一方で、実際の正規表現エンジンを動作させた場合、1つの抽出結果が得られる。
【0058】
図5の正規表現「.*(.)
1」は、長さ1以上の文字列を受理する。また、文字列の位置(p)は0から始まり、最初は何も抽出されていないので環境は空である。また、「(3,(1,a))」の「3」は、「abc」が正規表現「.*(.)
1」に受理されたこと(3文字目まで進んだこと)を意味する。「(1,a)」は、1番目のキャプチャが「a」を抽出したことを意味する。
【0059】
これに対し、本実施形態では、非特許文献7に記載の技術を拡張し、
図6に示すように、正規表現エンジンの決定的な振る舞いを定義する。
図6は、正規表現エンジンの決定的な振る舞いを説明する図である。
【0060】
rは正規表現である。rcは継続の正規表現である。wは入力文字列である。pは入力文字列上の位置である。Γは環境であり、キャプチャにより抽出した文字を添え字と対応付けて記録する関数である。dは方向である。
【0061】
入力された正規表現が「.*(.)1」であることを考える。正規表現エンジンに正規表現「.*(.)1」が設定された場合、正規表現エンジンは最初に「.*」が文字列にマッチするか否かを確認する。「.*」が文字列にマッチした場合、正規表現エンジンは、マッチした部分の後の部分について、後続の「(.)1」がマッチするか否かを確認する。
【0062】
図6では、正規表現の確認中の部分がrに入り、後続の部分はrcに入る。例えば、正規表現「.*(.)
1」について、最初はrが「.*」であり、rcが「(.)
1」である。そして、文字列wが「abc」であれば、「a」はrすなわち「.*」にマッチして、rc「(.)
1」にマッチすることはない。このため、「a」がキャプチャによって抽出されることはない。
【0063】
以下、修正装置10の具体的な動作例を説明する。修正装置10で用いられる正規表現の演算子は
図7の通りである。
図7は、正規表現の演算子を示す図である。
図7に示すように、通常のバッカスナウア記法の演算子に加え、ホールと呼ばれる演算子が用いられる。ホールは、プレースホルダとして機能する。テンプレートは、修正過程の正規表現であり、ホールを含む場合がある。ホールで表される箇所は修正中の箇所である。ホールはさらに範囲文字又はホールを含む構文に置き換えられる場合がある。
【0064】
ここでは、
図8に示す情報が修正装置10に入力されるものとする。
図8は、入力される情報の一例を示す図である。特定部151は、正例「{a<b>
1}」からキャプチャ対象の文字列「b」を特定する。修正部152は正規表現「.*(.*)
1」を修正する。修正後の正規表現は、正例である「a<b>
1」を受理し、1番目のキャプチャにより「b」を抽出し、かつ負例である「ac」を受理しない(拒否する)ことすることが要求される。
【0065】
図9から
図16、及び
図17を用いて、修正装置10の処理を説明する。
図9から
図16は、修正の手順を説明する図である。
図17は、修正装置の処理の流れを示すフローチャートである。
【0066】
まず、
図17に示すように、修正装置10は、正規表現、注釈付きの正例及び負例の入力を受け付ける(
図17のステップS101)。特定部151は、注釈を基にキャプチャ対象の文字列を特定しておく。
【0067】
そして、修正部152は、入力された正規表現のみを要素とする優先度付きキューQを作成(初期化)する(
図17のステップS102)。このとき、修正部152は、
図9に示すように、入力された正規表現「.*(.*)
1」をテンプレートとして優先度付きキューQに格納する。
【0068】
また、修正部152は、優先度付きキューQに格納したテンプレートに、応じた優先度を付与する。優先度は、入力された正規表現「.*(.*)1」とテンプレートとの間の編集距離が近いほど大きくなる。
【0069】
続いて、修正部152は、優先度付きキューQから優先度が最大である要素(テンプレート)を取り出す(
図17のステップS103)。なお、修正部152は、取り出したテンプレートを優先度付きキューQの中から削除する。すなわち、
図10に示すように、テンプレートtが「.*(.*)
1」となり、優先度付きキューQは空になる。
【0070】
ここで、修正部152は、テンプレートが答えを持つか否かを判定する(
図17のステップS104)。テンプレートが答えを持つことは、テンプレートに含まれるホールを範囲文字に置換した場合に、正例及び負例を満たすことである。テンプレート「.*(.*)
1」は、正例及び負例のいずれも満たさない。このため、修正部152は、テンプレートが答えを持たないと判定し(
図17のステップS104、No)、ステップS105に進む。
【0071】
そして、修正部152は、テンプレートの形を変えたものをQに追加する(
図17のステップS105)。ここでは、
図11及び
図12に示すように、修正部152は、テンプレート「.*(.*)
1」を「□*(.*)
1」及び「.*(□*)
1」に変え、新たなテンプレートとして優先度付きキューQに格納する。
【0072】
修正部152は、ステップS103に戻り、優先度付きキューQから(テンプレート)を取り出す。修正部152は、
図13に示すように、「□*(.*)
1」を取り出し、テンプレートとする。
【0073】
ステップS104において、テンプレートがホールを含む場合、修正部152は、テンプレートのホールを適切な範囲文字に置き換えることで、答えとなるか否かを確認する。修正部152は、
図6の定義に従って、テンプレートのホールを置換したときに得られる正規表現の動きを模倣し、テンプレートが答えになるための制約式を基にステップS104の判定を行う。
【0074】
なお、テンプレートは「□*(.*)1」は答えになり得ないため、ステップS104はNoとなる。制約式を基にした判定方法については次の例で説明する。
【0075】
ステップS105では、修正部152は、
図14及び
図15に示すように、テンプレートのホールをさらに置換して得られるテンプレートを、優先度付きキューQに格納する。なお、テンプレート情報141を参照する。
【0076】
なお、ステップS105では、修正部152は、直下の演算子が全てホールであるような演算子(例えば、「□*」)をホールに置換する。また、修正部152は、「.」等の範囲文字をホールに置換する。また、修正部152は、ホールをテンプレート情報121に含まれる構文(例えば、「□□, □|□, □*, (□), \i, (?=□), (?!□), (?<=□), (?<!□)」)のそれぞれに置換する。
【0077】
修正部152は、再びステップS103に進み、
図16に示すようにテンプレートとして「.*(□)
1」を取り出す。
【0078】
ここで、制約式について説明する。制約式は変数vi
xを含む。iは、テンプレートにおけるホールの位置である。ホールの位置は、左から0,1,2,…のような番号で表される。xは、ホールに対応する範囲文字に含まれる文字である。つまり、vi
xは、i番目のホールが文字xを含む範囲文字である場合に、正例又は負例が満たされればtrue、そうでなければfalseになる変数である。
【0079】
修正部152は、
図6の定義に従い、テンプレート「.*(□)
1」を正例「ab」上で動かす。その場合、まず「.*」が「a」とマッチする。そして、「(□)
1」と「b」と確認対象となる。「(□)
1」の0番のホール「□」が「b」を含む範囲文字であれば正例は満たされるため、制約式においてv
0
bはtrueとなる。
【0080】
また、修正部152は、
図6の定義に従い、テンプレート「.*(□)
1」を負例「ac」上で動かす。その場合、まず「.*」が「a」とマッチする。そして、「(□)
1」と「c」と確認対象となる。「(□)
1」の0番のホール「□」が「c」を含まない範囲文字であれば負例は満たされるため、制約式においてv
0
cはfalseとなる。
【0081】
これより、v0
b∧¬v0
cが制約式である。修正部152は、制約式が満たされるようにテンプレート「.*(□)1」の「□」を範囲文字に置き換えればよい。この場合、修正部152は、「□」を「[b]」、すなわち「b」のみを含む範囲文字に置き換え、答えである「.*([b])1」を得る。修正部152は、答えを出力し、処理を終了する。
【0082】
このように、修正部152は、第1の正規表現における範囲文字をプレースホルダに置換し、さらにプレースホルダを、キャプチャ対象の文字列を含み、キャプチャ対象の文字列以外の文字列を含まない範囲文字に置換する。
【0083】
なお、優先度付きキューQのテンプレートに編集距離に基づく優先度が付与されることで、修正部152はステップS103において編集距離が最小の正規表現になるテンプレートを取り出すことができる。このように、修正部152は、修正後の正規表現の候補のうち、修正前の正規表現との間の編集距離が最小である正規表現を、修正後の正規表現に決定することができる。
【0084】
上記の例では、「.*([b])1」以外にも正例及び負例を満たす修正後の正規表現の候補が存在し得るが、それらの候補と入力された正規表現「.*(.*)1」との編集距離は、最小でも「.*([b])1」と入力された正規表現「.*(.*)1」との編集距離と同じである。
【0085】
[第1の実施形態の効果]
これまで説明してきたように、特定部151は、正例に含まれる文字列のそれぞれに含まれる、キャプチャ対象の文字列を特定する。修正部152は、入力された第1の正規表現を、正例に含まれる文字列を受理し、負例に含まれる文字列を受理せず、キャプチャ対象の文字列のみを抽出する第2の正規表現に修正する。
【0086】
このように、修正装置10は、キャプチャによって抽出される文字列を考慮して正規表現の修正を行う。その結果、修正装置10は、抽出タスクに用いられる正規表現を修正し、かつその修正結果は全ての例を満たすことを保証することができる。
【0087】
さらに、修正装置10によれば、正規表現を用いた開発の場面において、利用者の意図した通りの正規表現を作ることが可能となり、正規表現に関するセキュリティ上の問題やバグがプログラムに混入されることを防ぐことができる。
【0088】
特定部151は、正例に含まれる第1の記号と第2の記号との間の文字列をキャプチャ対象の文字列として特定する。これにより、修正装置10は、キャプチャによって抽出される文字列の指定を受け付けることができる。
【0089】
修正部152は、第2の正規表現の候補のうち、第1の正規表現との間の編集距離が最小である正規表現を、第2の正規表現に決定する。このように、修正装置10は、正例及び負例を満たす正規表現のうち、なるべくシンプルな正規表現を出力する。これにより、正規表現を使った処理の負荷が低減され、及び正規表現の可読性等が向上する。
【0090】
修正部152は、第1の正規表現における範囲文字をプレースホルダに置換し、さらにプレースホルダを、キャプチャ対象の文字列を含み、キャプチャ対象の文字列以外の文字列を含まない範囲文字に置換する。このように、修正装置10はプレースホルダの置換を繰り返し、網羅的に正規表現を探索することで、より確実に答えを得ることができる。
【0091】
[システム構成等]
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示のように構成されていることを要しない。すなわち、各装置の分散及び統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散又は統合して構成することができる。さらに、各装置にて行われる各処理機能は、その全部又は任意の一部が、CPU及び当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【0092】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的に行うこともでき、あるいは、手動的に行われるものとして説明した処理の全部又は一部を公知の方法で自動的に行うこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【0093】
[プログラム]
一実施形態として、修正装置10は、パッケージソフトウェアやオンラインソフトウェアとして上記の学習処理を実行するプログラムを所望のコンピュータにインストールさせることによって実装できる。例えば、上記のプログラムを情報処理装置に実行させることにより、情報処理装置を修正装置10として機能させることができる。ここで言う情報処理装置には、デスクトップ型又はノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やPHS(Personal Handyphone System)等の移動体通信端末、さらには、PDA(Personal Digital Assistant)等のスレート端末等がその範疇に含まれる。
【0094】
また、修正装置10は、ユーザが使用する端末装置をクライアントとし、当該クライアントに上記の処理に関するサービスを提供するサーバ装置として実装することもできる。例えば、サーバ装置は、修正前の正規表現を入力とし、修正後の正規表現を出力とするサービスを提供するサーバ装置として実装される。この場合、サーバ装置は、Webサーバとして実装することとしてもよいし、アウトソーシングによって上記の処理に関するサービスを提供するクラウドとして実装することとしてもかまわない。
【0095】
図18は、プログラムを実行するコンピュータの一例を示す図である。コンピュータ1000は、例えば、メモリ1010、CPU1020を有する。また、コンピュータ1000は、ハードディスクドライブインタフェース1030、ディスクドライブインタフェース1040、シリアルポートインタフェース1050、ビデオアダプタ1060、ネットワークインタフェース1070を有する。これらの各部は、バス1080によって接続される。
【0096】
メモリ1010は、ROM(Read Only Memory)1011及びRAM(Random Access Memory)1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、ディスクドライブ1100に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ1100に挿入される。シリアルポートインタフェース1050は、例えばマウス1110、キーボード1120に接続される。ビデオアダプタ1060は、例えばディスプレイ1130に接続される。
【0097】
ハードディスクドライブ1090は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093、プログラムデータ1094を記憶する。すなわち、修正装置10の各処理を規定するプログラムは、コンピュータにより実行可能なコードが記述されたプログラムモジュール1093として実装される。プログラムモジュール1093は、例えばハードディスクドライブ1090に記憶される。例えば、修正装置10における機能構成と同様の処理を実行するためのプログラムモジュール1093が、ハードディスクドライブ1090に記憶される。なお、ハードディスクドライブ1090は、SSD(Solid State Drive)により代替されてもよい。
【0098】
また、上述した実施形態の処理で用いられる設定データは、プログラムデータ1094として、例えばメモリ1010やハードディスクドライブ1090に記憶される。そして、CPU1020は、メモリ1010やハードディスクドライブ1090に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出して、上述した実施形態の処理を実行する。
【0099】
なお、プログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1090に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、プログラムモジュール1093及びプログラムデータ1094は、ネットワーク(LAN(Local Area Network)、WAN(Wide Area Network)等)を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール1093及びプログラムデータ1094は、他のコンピュータから、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。
【符号の説明】
【0100】
10 修正装置
11 通信部
12 入力部
13 出力部
14 記憶部
15 制御部
141 テンプレート情報
151 特定部
152 修正部