有効な一致のリストのみに基づいて意味のある正規表現を生成できるコンピューター プログラムはありません。その理由をお見せしましょう。
例として 111111 と 999999 を指定すると、コンピューターは次のように生成します。
- これら 2 つの例に正確に一致する正規表現:
(111111|999999)
- 6 つの同一の数字に一致する正規表現
(\d)\1{5}
- 6 つの 1 と 9 に一致する正規表現
[19]{6}
- 任意の 6 桁に一致する正規表現
\d{6}
- 上記の 3 つのいずれかで、単語の境界がある場合。
\b\d{6}\b
- 最初の 3 つのいずれかで、前後に数字がないもの。例:
(?<!\d)\d{6}(?!\d)
ご覧のとおり、例を正規表現に一般化する方法はたくさんあります。コンピュータが予測可能な正規表現を構築する唯一の方法は、考えられるすべての一致を一覧表示することです。次に、それらの一致に正確に一致する検索パターンを生成できます。
考えられるすべての一致をリストしたくない場合は、上位レベルの説明が必要です。それこそが、正規表現が提供するように設計されているものです。6 桁の数字の長いリストを提供する代わりに、「任意の 6 桁」に一致するようにプログラムに指示するだけです。正規表現構文では、これは \d{6} になります。
正規表現と同じくらい柔軟な高レベルの記述を提供する方法は、正規表現と同じくらい複雑でもあります。RegexBuddyのようなツールができることはすべて、高レベルの記述の作成とテストを容易にすることです。簡潔な正規表現構文を直接使用する代わりに、RegexBuddy を使用すると、平易な英語のビルディング ブロックを使用できます。ただし、例を一般化する必要がある場合とそうでない場合を魔法のように知ることができないため、高レベルの説明を作成することはできません。
ユーザーが提供するガイドラインに従ってサンプル テキストを使用して正規表現を生成するツールを作成することは確かに可能です。このようなツールを設計する際の難しい部分は、正規表現自体よりもツールの習得を難しくせず、ツールを一般的な正規表現ジョブまたは単純な正規表現に制限することなく、必要なガイド情報をユーザーにどのように求めるかです。