正規表現初心者用・正規表現の入力をサポートする Windows アプリケーションを公開してみる

正規表現の入力をサポートする
Windows アプリケーションを作成したため
皆さんの助けになれれば幸いと思い
公開してみます。

[html バージョンはこちら(オンラインで動作します)(操作方法が若干違います)](https://uni928.github.io/sephiroth_regular_expression_creater/)

[本体はこちら(BOOTH)](https://giftedstyle.booth.pm/items/5931295)
[本体はこちら(Google Drive)](https://drive.google.com/file/d/1O3C0ZD-3xpy2O6VYTB1j7AmXlGL0MXXL/view?usp=sharing)

***

このアプリケーションの説明

正規表現の入力をサポートする
Windows アプリケーションです。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/f64f5b39-f3d8-eac9-528f-856faedfecc4.png)


正規表現はどんな種類があるか
入力欄の下に一覧でボタンを配置しています。
なので一覧を見ながら文字列を考える事ができます。

ボタンを押すことで
実際に入力する事もできます。

マウスの右を押しながら
各ボタンを押すことで説明文を見れます。

"[" の直後に "]" を入力すると
その間に自動で入力場所が移動します。

***

このアプリケーションのコード

このアプリケーションの開発環境は
下記の URL からダウンロードして下さい。
https://drive.google.com/file/d/1UgA5xRuL1qZQtiSMth-ycHtP0Fs_-ScC/view?usp=sharing

このアプリケーションは
次のコードで動作しています。

リファクタリングの余地があり
現状良くないコードな点はご容赦下さい。

```Csharp:使用したコード
using System.IO;
using System.IO.Compression;
using System.Text;

namespace SephirothRegularExpressionCreater
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Exec(string insert)
        {
            int index = textBox1.SelectionStart;
            textBox1.Text = textBox1.Text.Substring(0, index) + insert + textBox1.Text.Substring(index);
            ActiveControl = textBox1;
            textBox1.SelectionStart = index + insert.Length;
            textBox1.SelectionLength = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[0-9]");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[0-9a-zA-Z]");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[ -~]");
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[ぁ-んー]");
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[ァ-ンヴー]");
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("日本語 1 文字に一致。\n\n空白文字を省きたい場合は後ろの\"\\s　\"を省いて下さい。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[ぁ-んァ-ヶー\\u30a0-\\u30ff\\u3040-\\u309f\\u3005-\\u3006\\u30e0-\\u9fcf\\s　]");
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("論理行頭\r\n例1）^○ → 行頭の○\r\n例2）^\\x20+ → 行頭の半角スペースの連続\r\n例3）^\\n → 空白行\r\n例4）^.*$ → 行全体\r\n例5）^　>\\x20 → 行頭に「> 」を挿入", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("^");
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("\t\r\n論理行末\r\n例1）。$ → 行末の。\r\n例2）^.*$ → 行全体", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("$");
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("\t\r\n任意の1文字\r\n例1）A.C → ABC、A1C、AあC などにマッチ\r\n例2）b.k → bから始まってkで終わる3桁の文字列", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec(".");
            }
        }

        private void button10_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("直前のパターンの1回以上繰り返し（最長一致）\r\n例1）ABC+ → ABC、ABCCCCCC などにマッチ\r\n例2）b.+k → bから始まってkで終わる3桁以上の文字列", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("+");
            }
        }

        private void button11_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("\t\r\n直前のパターンの0～1回繰り返し（最長一致）\r\n例）ABC? → AB、ABC にマッチ", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("?");
            }
        }

        private void button12_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("直前のパターンのm回からn回繰り返し（最長一致）\r\n例1）ABC{3,5} → ABCCC、ABCCCC、ABCCCCC にマッチ\r\n例2）0\\d{1,4}-\\d{1,4}-\\d{4} → 電話番号\r\n例3）\\d{4}[/\\.年]\\d{1,2}[/\\.月]\\d{1,2}日? → 日付", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("{m,n}");
            }
        }

        private void button13_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("直前のパターンの1回以上繰り返し（最短一致）\r\n例1）ABC+? → ABC にマッチ\r\n例2）\\b[Ww]h.+?\\b → whで始まる3文字以上の単語", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("+?");
            }
        }

        private void button14_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("\t\r\n直前のパターンの0回以上繰り返し（最短一致）\r\n例1）ABC*? → AB にマッチ\r\n例2）<[hH][1-3].*?> → 見出しタグ開始（h1～h3まで）", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("*?");
            }
        }

        private void button15_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("直前のパターンの0～1回繰り返し（最短一致）\r\n例1）ABC?? → AB にマッチ", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("??");
            }
        }

        private void button16_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("直前のパターンの0回以上繰り返し（最長一致）\r\n例1）ABC* → AB、ABC、ABCCCCCC などにマッチ\r\n例2）b.*k → bから始まってkで終わる2桁以上の文字列", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("*");
            }
        }

        private void button17_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("直前のパターンのmin回からmax回繰り返し（最短一致）\r\n例1）ABC{3,5}? → ABCCC にマッチ\r\n例2）\\d{4,10}? → 4～10桁の数字（最短一致）", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("{m,n}?");
            }
        }

        private void button18_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("\t\r\n直後のメタ文字をエスケープする\r\n（直後の文字を正規表現の記号（メタ文字）として扱わないことを指定）\r\n例）\\\\ → 文字の「\\」にマッチ", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\");
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if(textBox1.SelectionStart < 2)
            {
                return;
            }
            if (textBox1.Text[textBox1.SelectionStart - 2] == '[' && textBox1.Text[textBox1.SelectionStart - 1] == ']' && textBox1.SelectionLength == 0)
            {
                textBox1.SelectionStart = textBox1.SelectionStart - 1;
                textBox1.SelectionLength = 0;
            }
        }

        private void button19_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\A");
            }
        }

        private void button20_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("語の区切り位置\r\n例）\\bam\\b → amという単語", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\b");
            }
        }

        private void button21_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("語の区切り位置以外\r\n例）\\Bam\\B → 単語の途中にあるam", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\B");
            }
        }

        private void button22_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("\t\r\nすべての半角数字\r\n例1）\\d → 半角数字\r\n例2）\\d+ → 数字列\r\n例3）\\d{4} → 4桁の数字\r\n例4）\\d{4,} → 4桁以上の数字\r\n例5）\\d{1,4,} → 4桁までの数字（1～4桁の数字）\r\n例6）\\d{4,10} → 4～10桁の数字（最長一致）\r\n例7）\\d{4,10}? → 4～10桁の数字（最短一致）\r\n例8）\\d*[135791]\\b → 奇数\r\n例9）\\b\\d{1,3}(,\\d{3})*\\b → 桁区切りのカンマ付数字列\r\n例10）\\\\\\d{1,3}(,\\d{3})*\\b → 価格（先頭が「\\」の桁区切り付数字列）\r\n例11）(〒|ZIP：)\\d{3}-\\d{4} → 郵便番号\r\n例12）0\\d{1,4}-\\d{1,4}-\\d{4} → 電話番号\r\n例13）0[89]0\\d{8} → 携帯電話番号(ハイフンなし)\r\n例14）\\d{4}[/\\.年]\\d{1,2}[/\\.月]\\d{1,2}日? → 日付", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\d");
            }
        }

        private void button23_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("半角数字以外すべて\r\n例）\\D → 半角数字以外", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\D");
            }
        }

        private void button24_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("空白文字（半角スペース、\\t、\\n、\\r、\\f）すべて\r\n例）\\s → 空白文字", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\s");
            }
        }

        private void button25_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("空白文字（半角スペース、\t、\n、\r、\f）以外すべて", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\S");
            }
        }

        private void button26_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("すべての半角英数字とアンダースコア\r\n例1）[\\w.\\-]+@[\\w\\-]+\\.[\\w.\\-]+ → メールアドレス\r\n例2）https?://[\\w/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+ → URL（ホームページアドレス）", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\w");
            }
        }

        private void button27_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("半角英数字とアンダースコア以外すべて", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\W");
            }
        }

        private void button28_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("この項目は説明がありません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("\\Z");
            }
        }

        private void button29_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("括弧内のいずれか1文字\r\n例1）[ABC] → A、B、C のいずれかにマッチ\r\n例2）[A-G] → A、B、C、D、E、F、G のいずれかにマッチ\r\n例3）[０-９] → 全角数字\r\n例4）[Ａ-Ｚ]+ → 全角英大文字列\r\n例5）[ぁ-ん] → ひらがな\r\n例6）[ァ-ヴ] → カタカナ\r\n例7）[ｦ-ﾟ] → 半角ｶﾀｶﾅ\r\n例8）[一二三四五六七八九十壱弐参拾百千万萬億兆〇]+ → 漢数字列\r\n例9）[0-9A-F]{2} → 0-9とA-Fのいずれかの2文字（2桁の16進数）", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[]");
                textBox1.SelectionStart = textBox1.SelectionStart - 1;
                textBox1.SelectionLength = 0;
            }
        }

        private void button30_Click(object sender, EventArgs e)
        {
            if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                MessageBox.Show("括弧内に含まれない1文字\r\n例1）[^ABC] → A、B、C 以外のいずれかにマッチ\r\n例2）[^A-G] → A、B、C、D、E、F、G 以外のいずれかにマッチ\r\n例3）[^\\u\\l] → 半角英字以外", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
            else
            {
                Exec("[^]");
                textBox1.SelectionStart = textBox1.SelectionStart - 1;
                textBox1.SelectionLength = 0;
            }
        }
    }
}
```

***

以上 Windows アプリケーションを公開しました。

入力した正規表現をチェックをしてくれるサイトは
たくさんあり、とても助かるのですが
このように入力に使う用のサイトは
なかなか見つからないため
そんなサイトがネット上に増えたら嬉しいなと思い
簡単に作成する事にしました。

需要はある気がするので
是非皆さんも作成して頂けると幸いです。

正規表現初心者の私が喜びます。

皆さんの開発の助けになれますように
閲覧ありがとうございました。

***

参考にしたサイト：
https://www.megasoft.co.jp/mifes/seiki/meta.html
https://qiita.com/ktr1211/items/132e7216709c912917c6