1

正規表現の記述支援を目的とした意味情報に基づく
用例検索システム
竹重 拓輝

柗本 真佑

楠本 真二

プログラミングにおける強力かつ汎用的な文字列処理の仕組みとして，正規表現が広く知られている．一方で，その利用には一定の難しさがあるとされている．正規表現の利用を支援する方法の一つとして，過去の用例を参考にした
再利用が考えられる．しかし，再利用するパターンの検索には課題が存在する．ソースコードを対象とした API 検
索やスニペット検索は正規表現パターンの再利用というシナリオにおいてはその利用は適当であるとはいえない．本
研究では，正規表現におけるパターンの効率的な再利用を目的とし，正規表現の用例検索システム Resem を提案する．Resem はパターンの意味を検索クエリとして受け付け，検索結果の用例には対応する入出力例を併記する．これらの特徴からパターン作成における，目的の処理の分析や特殊文字の読み取りに係るユーザーの負担を軽減する．
また，Resem の有用性を評価するため被験者実験を行い，パターン記述に要する時間を減少させることを確認した．

Regular expression is widely known as a powerful and general-purpose text processing tool for programming.
Though the regular expression is highly versatile, there are various diﬃculties in using them. One promising
approach to reduce the burden of the pattern composition is reuse by referring to past usages. Still, several
source code-specialized search engines have been proposed, they are not suitable for the scenario of reusing
regular expression patterns. The purpose of this study is the eﬃcient reuse of regular expression patterns.
To achieve the purpose, we propose a usage retrieval system Resem specialized in regular expression patterns. Resem adopts two key features: search by semantics and collecting input/output examples. As anevaluation result, we conﬁrm that Resem decreased the time required for describing patterns by 16%.

し，一般化するという問題分析の難しさも存在する

1 はじめに[10]．この分析が不十分な場合，パターンの過剰適合正規表現は高い汎用性を持つ一方で，その利用には（正しくない文字を受理）や過小適合（正しい文字を一定の難しさがあることが知られている．この難し非受理）という問題に繋がる．

さの要因の一つは，パターン内における非直感的な特パターンの作成に係る負担を軽減する方法の一つと殊文字（メタ文字）の存在にある [10]．代表的な特殊

して，過去の用例を参考にした再利用が考えられる．

文字としては文字クラス\s\d\w や，量指定文字*+?，ソースコードに特化した検索の仕組みとして，API

グルーピング文字 ()[] などが挙げられる．わずか数

検索 [2] [13] やスニペット検索 [9] [3] が存在する．これ

文字で文字列処理の様々な制御が可能である一方で，らの手法を正規表現の用例検索に応用することも可

特殊文字と処理内容との対応は直感的とはいえない．

能であるが，正規表現パターンの再利用というシナリ

また，処理対象データと行いたい処理の内容を理解

オにおいては適当であるとは言えない．これは，その検索結果がコードスニペットであるためである．再Semantic-Based Retrieval System for Regular Expression Usages
Hiroki Takeshige, Shinsuke Matsumoto, Shinji
Kusumoto, 大阪大学大学院情報科学研究科, Graduate School of Information Science and Technology,
Osaka University.
[研究論文 (レター)] 2023 年 03 月 29 日受付.

利用するパターンを入手したい開発者が API 検索やスニペット検索を用いる場合，正規表現を使用するメ
ソッドの呼び出し箇所を検索すると考えられる．このとき，パターンが変数としてメソッドに渡されている場合，実行時にどのようなパターンがその変数に格コンピュータソフトウェア

2

納されているかは，プログラムの動作を解析しなけれ

2. 2 正規表現利用の支援とその課題

ば読み取れない．

不具合の発生を抑えつつ効率的に正規表現を利用

本研究の目的は，正規表現におけるパターンの効するため，多くの開発者は正規表現の記述支援の利用

率的な再利用である．この目的を達成するために，や，過去に作成されたパターンの再利用を行ってい正規表現に特化したパターンの用例検索システム

ることが報告されている [10] [4]．記述支援としてはResem を提案する．Resem は，正規表現の意味やユーザーが記述したパターンに対し，シンタックスハ

使用目的を検索クエリとして受け付ける．これによ

イライトの適用 [6] や指定した入力とのマッチング結りパターンの内容ではなく，パターンの持つ意味や果のリアルタイムでの表示 [5] がある．これらのツー解釈による検索を実現する．さらに検索結果には，

ルは正規表現の構文理解に係る負担を軽減する．一

その用例に対応する入出力例を提示する．具体的方，パターンの入力が必要であるため，ユーザーはまな入出力例はパターンの理解を補助する強力な情ず自力でパターンを作成しなければならない．この報となるといえる．例えば，ある用例が\d+\.\d+で他の多くの記述支援手法 [12] [7] [8] においても同様にあった場合，1.2 → accept や 1.2beta → rejectパターンの入力を求められるため，これらの手法はパなどの例を併記する．これらの特徴から目的の処

ターン作成の負担を取り除いているとは言えない．

理の分析や特殊文字の読み取りに係るユーザーの正規表現パターンの作成に係る負担を軽減する方

負担を軽減する．Resem の有用性を評価するため法の一つとして，過去に作成されたパターンを再利用に被験者実験を行った．その結果，Resem の使用するという方法が考えられる．新たに実装する処理

によりパターンの記述に要する時間が 16%減少すに対して適当なパターンであるかはその都度検証しることを確認した．現在，Resem のプロトタイプ

なければならないが，パターンを自力のみで作成するを https://tyr.ics.es.osaka-u.ac.jp/resem によりも容易に記述できる．

て公開している．

しかし，再利用する用例の検索には課題点が存在す
る．ソースコードの記述に関連する Web 検索は一般

2 関連研究的な内容の検索よりも多数のページを探索しなけれ

2. 1 正規表現利用の課題

ばならず，所要時間などの面で高いコストを要すると正規表現は文字列処理に広く採用されている一方，されている [11]．また，正規表現においては定義した

そのパターンの記述は容易ではないと指摘されてい文字列集合を Web 検索のクエリにすることが難しい

る [10]．この原因としてパターンに使用する特殊文字とされている [10]．これは検索クエリの作成においてが直感的でないこと，及び処理対象の文字列と処理内も目的とする処理を分析，分解し，言語化しなければ

容について正確な分析が必要であることが挙げられならないためである．さらに，正規表現には言語や実る．正規表現で使用される特殊文字はわずかな文字

装によって特殊文字の用法に違いが存在 [4] し，自身数で様々な処理の制御を行う．このため，処理内容とが使用する環境と一致するかを考慮して検索しなけ

その表現が乖離し，その振る舞いを想像することが難ればならない．

しい場合がある．また，パターンを作成する際は，対ソースコードに特化した検索として，API 検索 [2]象とする入力文字列を分析し，期待通りの出力を得る[13] やスニペット検索 [9] [3] が存在する．API 検索はためにどのような一般化が必要か検討しなければな

API 名や引数を指定し，その使用例を提示するシス

らない．分析が不十分であれば，一般化を過剰や過少テムである．API を指定して検索するため，動作環に行ってしまい，パターンの動作が期待と異なるもの

境を指定しやすく，また提示される検索結果がソーとなり，不具合の原因となる場合がある．

スコードであるため，Web ページと比べて正規表現に関する記述を探しやすいといえる．スニペット検
索はソースコード中の単語をクエリとしてその周囲

Vol. 0 No. 0

1983

3

をコードスニペットとして提示するシステムである．
意味による検索クエリとして探したいコードの周囲の単語を用いられることから，API を使用する目的に関連した単語で

パターン
意味

検索することで，これを考慮した検索が可能である．

入出力例

しかし，API 検索とスニペット検索の双方に共通する課題点として，得られたソースコードからパター

スニペット

ンを再利用することが難しい点がある．検索結果として得られたソースコードのどの部分にパターンが記述されているかはユーザーが自分で探さなければならない．よって変数への代入を辿るなど，実行時の動作を解析しなければならない場合がある．また，得られた検索結果から目的とするパターンを選択する

図1

Resem の外観にはパターンがどう動作するか読み取らなければならない．これはパターンにおける直感的でない特殊力エリアに検索クエリを入力する．このとき，検索文字の使用から，その作成と同様の負担が発生する．

クエリは受理したい文字列集合の意味を用いる．図

本研究と同様のアプローチとして，正規表現に特の例ではバージョン番号を表す文字列を受理するパ化したデータベースである RegExLib [1] が存在する．

ターンを検索するため，“version” と入力している．1

RegExLib はユーザーによって投稿されたパターンを件目の検索結果として\d+(\.\d+(\.d+)?)?というパ検索できるシステムである．ユーザーはパターンとターンを用いる用例が出力されている．1 つの用例はともにパターンのタイトルや説明，入出力例をともにパターン，意味，入出力例，API 使用箇所スニペット

投稿する．しかし，パターンの投稿は 2010 年以来行から成る．ユーザーは出力された用例のうち自身のわれていない．パターン収集をユーザーの投稿に依目的に合ったものを参考にしてパターンを記述する．

存したシステムではデータベース拡大に限界が存在以降では Resem の 2 つの特徴を説明する．

するといえる．

3. 2 F1 意味による検索

3 提案手法Resem は検索クエリとしてパターンが受理する文

3. 1 概要

字列の意味を用いる．この特徴からユーザーはパター

本研究では前章で述べた課題の解決を目的として，ンをどう組み立てるかではなく，何を実現したいかで正規表現に特化した用例検索システム Resem を提案検索できる．例えば，セマンティックバージョニング

する．Resem はオープンソースソフトウェアのソーを採用しているソフトウェアのバージョン番号を受

スコードを対象として正規表現の用例を収集する．収理するパターンを検索することを考える．このとき，集の際，各用例に対してソースコードの解析によってユーザーは version や semantic といった単語を入力得られた意味を設定し，その意味を検索文字列としたすればよく，数字や繰り返しを正規表現でどのように用例の検索機能を提供する．Resem は次の 2 つの特表現するかは考える必要がない．

徴を持つ．1 つはパターンが持つ意味による検索が可

この特徴を実現するため，パターンが受理する文字能である点（F1）．もう 1 つはパターンの入出力例を

列が持つ意味を集める．パターンが受理する文字列の提示する点（F2）である．これらの特徴から正規表

意味は正規表現 API の使用箇所周囲にある識別子か

現の利用経験が浅いユーザーでも参考とする用例をら収集する．パターンや入力文字列を格納する変数，

効率的に検索できるようになる．

API 呼び出しを行っているメソッドの名前はパター

Resem の外観を図 1 に示す．ユーザーは上部の入ンが持つ意味に関連するものが設定されていると仮コンピュータソフトウェア

4定する．抽象構文木の解析によりプログラム中の正規表現を用いる API の呼び出しを検出し，前述の識別子を収集する．

シナリオ
与えられた文字列がソフトウェアのバージョン番号として有効か判定したい．
バージョン番号はメジャー番号，マイナー番号，パッチ番号の3つの非負整数からなり，これらがこの順で.（ドット）で連結された文字列である．このような文字列のときのみtrueを返すよう String#matchesに渡すべき正規表現パターンを作成せよ．
入出力例

3. 3 F2 入出力例の提示
正規表現 API に対する入力文字列とそれに対する出力を，使用されたパターンに対する入出力と表現す
る．Resem は検索結果として正規表現の用例を出力

input
output------------------------例1: 2.10.3→ true例2: 11.2→ false例3: 3.0.a→ false
例4: (空文字)→ false
解答例\d+\.\d+\.\d+

する際，同時に各パターンに対する入出力例をともに出力する．入出力の例示により，パターンが含む記号

図2

出題したタスクの例（タスク 2）

を解釈せずともそのパターンが受理する文字列集合
がどのようなものであるか想像できる．この特徴はユーザーが検索結果として出力された用例から，参考

4 実験とする用例を選択する際の効率を向上させる．例え

実験実施にあたり，次の問いを設定する．

ば検索結果として\d+\.\d+\.\d+というパターンがQa Resem はパターンの記述に要する時間

得られた場合，1.2.3 や 17.8.10 のような具体的な文字列をともに出力する．ユーザーは\d や+が何を表すかを気にせず，自身が受理させたい文字列に類似する文字列を受理するパターンを探せばよい．
提示する入出力例にはソフトウェアテスト実行時を短縮するかQb 意味による検索（F1）は用例の探索を容易にするか

Qc 入出力例の提示（F2）は用例の選択を容易にするかに与えられた入力と，これに対する出力を用いる．こQa を調査するため，被験者に文字列処理タスクを

れらは収集対象のプログラムのテスト実行時に正規出題し，Resem 使用の有無による所要時間の差を調表現 API に与えられるパターン，入力文字列，およ査する．また，Qb 及び Qc を調査するため，被験者がびその出力の解析によって得る．

Resem を使用した際の印象やコメントを収集する．

入出力の解析の流れは以下の通りである．まず，

3. 2 節で検出した正規表現 API の使用箇所に入出力

4. 1 実験設定

収集用のコードを埋め込む．このコードは実行され

本実験では被験者に対し，文字列処理を行うタスク

ると API に対して与えられるパターン，入力文字列，を出題する．出題するタスクは文字列処理を行うシ

API の出力をファイルなどに書き出す．次に，埋めナリオと，そのシナリオにおける入出力例から成る．

込みを行ったコードをテストを用いて実行する．最

出題したタスクを 1 題抜粋し，図 2 に示す．この後に，埋め込みコードの出力を解析することでパター

タスクでは入力文字列がバージョン番号の書式に沿うンに対する入出力を収集する．

かを確認するシナリオが提示され，また，シナリオの理解を補助するため入力例と期待する出力が示されて

3. 4 用例収集結果

いる．被験者はこのシナリオに沿ったパターンを作成

GitHub 上の公開プロジェクトから用例の収集を行する．このタスクでは\d+\.\d+\.\d+が正解となる．

い，68 件のプロジェクトから 3,120 件の用例を収集し出題するシナリオは以下の条件で作成した．

た．使用したプロジェクトは README.md ファイ

1. 特定のアプリケーションに強く依存せず，一般

ルに文字列 “gradle” を含む Java プロジェクト 1,000件である．これはソフトウェアテスト実行時にビルドツールである Gradle を使用したためである．

性を持つ

2. Resem が収集した用例に参考となるものが存在するVol. 0 No. 0
300s

5

シナリオ
アルファベットと数字が混ざった文字列がある．この文字列をアルファベットのみからなる部分文字列と数字のみからなる部分文字列が交互に並ぶよう切り分けたい．String#split に渡すべき正規表現パターンを作成せよ．

制限時間 (300s)

Resem 使用

1983

Resem 非使用

平 200s
均所
要時
間 100s

入出力例
input
output------------------------------------------------例1: 2022January31→ [2022, January, 31]
例2: ac33o4k22→ [ac, 33, o, 4, k, 22]
例3: 空文字
→ []
解答例

0s

図3

(?<=\w)(?=\d)|(?<=\d)(?=\w)

1

2

3

4

5

6

タスク番号

7

8

9

10

1

図4

タスク 10Resem 使用時と非使用時の平均所要時間

4. 2 結果

条件 1 は特定のアプリケーションに依存したシナ各タスクにおける，グループごとの平均所要時間のリオは評価に不適切と考えたため設定する．アプリ

差を図 3 に示す．横軸はタスクの番号であり，縦軸

ケーションに依存したシナリオはそのアプリケーショ

は各タスクの平均所要時間である．青は Resem を使ンの利用における有用性しか確認できない．より一用可能な状態で解答したグループ，灰色は使用を禁止

般的な状況を想定し実験を行うため，特定のアプリ

したグループである．不正解及び制限時間に達した

ケーションに依存したシナリオは作成しない．

被験者の所要時間は 300 秒として扱っている．

条件 2 は実験目的の限定のため設定する．被験者

タスク 4 を除く全てのタスクにおいて Resem を実験は提案手法における用例提示部分の有用性の評使用したグループの平均所要時間が短い．全タスク

価を目的としている．参考となる用例が収集されての減少率の平均は約 16%だった．また，タスク 10 はいないシナリオでは Resem は用例の提示を行えず，

Resem 非使用のグループには正解者がいなかったが，用例提示の有用性の評価を行えない．よって，収集さ使用したグループは 6 人中 2 人が正解した．タスク

れた用例を元にシナリオを作成する．

10 を図 4 に示す．タスク 10 は与えられた文字列を

また，全てのタスクへの解答後，被験者に対しアン

アルファベットと数字に分割するタスクである．このケートを行う．さらに，Resem 対する意見を自由記

タスクへの解答には先読みと後読みという正規表現の述による回答で求める．

機能が必要であり，Web 検索によって解答するには被験者は大学教員 1 名，学生 11 名の計 12 名である．

それらの機能についてある程度の知識が必要だったと

本実験では各タスクについて，Resem 使用者と非予想される．一方 Resem を使用しこのタスクに正解

使用者の所要時間の差に注目する．よって被験者を 2した被験者は “alphabet num” を検索クエリとして，グループに分け，それぞれのタスクにおいて一方のグ参考とする用例を発見していた．これより，Resem

ループには Resem を使用させ，他方には Resem を

では正規表現に対する知識が少なくとも，高度な機能

使用させない．なお，Web 検索はどちらのグループを使用する用例の検索が可能であるといえる．

も実験を通して使用可能とする．グループ分けは事

タスク 4 においては Resem を使用したグループ

前のアンケートによってプログラミングや正規表現のほうが所要時間が長くなった．これは被験者が使のスキルに偏りが生まれないようにし，タスクの半数用したクエリと，Resem が収集した意味が一致しな

で Resem 使用の可否を入れ替えることで実験結果がかったためである．タスク 4 は指定の文字種以外の

個人のスキル差の影響を受けないようにする．

文字を置換する際に使用するパターンを作成するタスクであった．このタスクに対し，Resem を使用してタスクに取り組んだ被験者は “space” や “replace”，“not contain” などのクエリで検索していた．一方，参コンピュータソフトウェア

6
全くそう思わない

そう思わないどちらとも言えない提示された用例はパターンの記述に役立った
意味をクエリとした検索は用例を探しやすかった

1

1

一方，適当な意味が付与されていない場合，Web541いパターンの作成に効果があった点から判断した．

3

5

2

4

検索よりも所要時間が長くなる場合があった．また，

26る．これは，意味による検索や入出力の例示について好意的な回答が多かった点，および Web 検索が難し

462

用例の表示順は適当だった
今後も Resem を使用したい

強くそう思う62

入出力例はパターンの動作を理解する上で役立った

そう思う

2
4

検索に使用する単語の選択が難しかったという意見から，シナリオから連想しやすい意味の付与を行えていない場合があると考えられる．

図5

アンケート結果（数字は各選択肢の回答者数）
1

5 おわりに考にされると想定した用例に付与された意味は “suite”

本研究ではパターン記述の支援を目的として意味

や “name” といったものであり，被験者が検索に使用による検索を実現するシステム Resem を提案した．

した意味は付与されていなかった．このため，被験者

さらに，被験者実験を行い，Resem の有用性を評価

はこの用例を見付けられず，Resem を使用した時間

した．その結果，Resem は過去の用例の再利用を容が web 検索へ移るまでの不要な時間となったと考え易にし，パターン記述に要する時間を 16% 短縮した．

られる．

今後の課題としてパターンに対する意味付与方法

また，Resem 使用後のアンケート結果を図 5 に示の改善が挙げられる．実験結果より，正規表現使用箇

す．提示された用例が役立ったという回答が半数を超所付近の識別子から意味を収集する現在の方法は検えていることから用例検索による記述支援は有用だっ索に適した意味をパターンに付与できない可能性がたといえる．さらに，意味での検索や入出力例の提示ある．よりユーザーの想定に近い意味を付与できれに対して好意的な回答が多かったことから，Resem

ばユーザーの検索効率を向上させ，さらなるパターンの特徴（F1，F2）は有用であったといえる．

記述時間の短縮が期待できる．

このほか，Resem に対する意見として次の回答を得た．
入出力例やコードスニペットにより，パターンの意味がわかりやすかった検索上位だが欲しい検索結果ではない例を読み飛ばすとき，入出力例が便利だった
検索クエリとして適切な単語を見つけにくい場合があった

4. 3 考察
被験者実験の結果より，Qa について，Resem の
使用はパターンの記述に要する時間を短縮できるといえる．難度の高いタスクにおいて大きな差が見られることから，実際の開発においても作成に時間の掛かる複雑なパターンの作成に寄与すると考えられる．
また，Qb および Qc について，Resem の特徴 F1と F2 は用例の探索と選択を容易にすると考えられ

謝辞 本研究の一部は，JSPS 科研費（JP21H04877,

JP20H04166, JP21K18302, JP21K11829, JP21K11820,
JP22H03567, JP22K11985）による助成を受けた．
参 考 文 献[ 1 ] : Regular Expression Library, accessed 2022-0621. https://regexlib.com/.
[ 2 ] Asyroﬁ, M. H., Thung, F., Lo, D., and Jiang,
L.: AUSearch: Accurate API usage search in
GitHub repositories with type resolution, Proc. Int.
Conf. Softw. Anal. Evol. and Reengineering, 2020,
pp. 637–641.
[ 3 ] Chatterjee, S., Juvekar, S., and Sen, K.: Sniﬀ: A
search engine for java using free-form queries, Proc.
Int. Conf. Fund. Approaches to Softw. Eng., 2009,
pp. 385–400.
[ 4 ] Davis, J. C., Michael IV, L. G., Coghlan, C. A.,
Servant, F., and Lee, D.: Why aren’t regular expressions a lingua franca? an empirical study on there-use and portability of regular expressions, Proc.
Joint Meet. Eur. Softw. Eng. Conf. Symp. Found.
Softw. Eng., 2019, pp. 443–454.
[ 5 ] Dib, F.: RegEx101, accessed 2022-02-07. https:

Vol. 0 No. 0//regex101.com/.
[ 6 ] JetBrains: Regular expressions assistance, accessed 2022-02-07. https://www.jetbrains.com/
help/rider/Regular_Expressions_Assistance.html.
[ 7 ] Larson, E.: Automatic Checking of Regular Expressions, Proc. Source Code Anal. Manip., 2018,
pp. 225–234.
[ 8 ] Larson, E. and Kirk, A.: Generating evil test
strings for regular expressions, Proc. Int. Conf.
Softw. Testing, Veriﬁcation and Validation, 2016,
pp. 309–319.
[ 9 ] Linstead, E., Bajracharya, S., Ngo, T., Rigor,
P., Lopes, C., and Baldi, P.: Sourcerer: mining
and searching internet-scale software repositories,
IEEE Trans. Data Mining and Knowledge Discovery, Vol. 18, No. 2(2009), pp. 300–336.
[10] Michael, L. G., Donohue, J., Davis, J. C., Lee,D., and Servant, F.: Regexes are hard: Decisionmaking, diﬃculties, and risks in programming regular expressions, Proc. Int. Conf. Automated Softw.
Eng., 2019, pp. 415–426.
[11] Rahman, M. M., Barson, J., Paul, S., Kayani,
J., Lois, F. A., Quezada, S. F., Parnin, C., Stolee,
K. T., and Ray, B.: Evaluating how developers use
general-purpose web-search for code retrieval, Proc.
Int. Conf. Mining Softw. Repos., 2018, pp. 465–
475.
[12] Spishak, E., Dietl, W., and Ernst, M. D.: A
Type System for Regular Expressions, Proc. Formal Techn. Java-like Programs, 2012, pp. 20–26.
[13] Zhong, H., Xie, T., Zhang, L., Pei, J., and Mei,
H.: MAPO: Mining and recommending API usage
patterns, Proc. Eur. Conf. Object-Oriented Program., 2009, pp. 318–343.

1983

7
竹重拓輝

2022 年大阪大学基礎工学部情報科学科卒業．同年より同大学大学院情報科学研究科コンピュータサイエンス
専攻博士前期課程在学中．正規表現に関する研究に従事．
柗本真佑2010 年奈良先端科学技術大学院大学
博士後期課程修了．同年神戸大学大学院システム情報学研究科特命助教．

2016 年大阪大学大学院情報科学研究科助教．博士（工学）．エンピリカルソフトウェア工学の研究に従事．
楠本真二

1988 年 大 阪 大 学 基 礎 工 学 部 卒 業 ．
1991 年同大学大学院博士課程中退．
同年同大学基礎工学部助手．1996 年
同講師．1999 年同助教授．2002 年
同大学大学院情報科学研究科助教授．2005 年同教授．
博士（工学）．ソフトウェアの生産性や品質の定量的評価に関する研究に従事．電子情報通信学会，情報処
理学会，IEEE，JFPUG，PM，SEA 各会員．