文字列を置換するときにひとつの文字列しか置換できないのは不便だと思いませんか? C#で登録している文字列を置換する簡易テキストエディタを作成する方法を紹介します。
ソースコードをワードプレスに投稿するとき、そのままではいけません。<、>は &lt;、&gt;に置き換える必要があります。あと & も&に置き換える必要があります。そこで置換できるアプリを作成してみました。それぞれの文字列をひとつずつ置換するのではなく、登録している複数の文字列をまとめて置換できます。
参考にしたページ
Visual Studioでアプリケーションの設定を保存する
まずデザイナで以下のようなものをつくります。
そして[プロジェクト] ⇒ [プロパティ]の設定の項目を以下のように設定します。
[設定]ボタンがクリックされたら設定のためのフォームを表示させます。
1 2 3 4 5 6 7 8 |
public partial class Form1 : Form { private void buttonConfig_Click(object sender, EventArgs e) { Form2 f = new Form2(); f.ShowDialog(); } } |
設定のためのフォームが表示されたら、これまでの設定を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public partial class Form2 : Form { private void Form2_Load(object sender, EventArgs e) { Properties.Settings.Default.Reload(); textBoxOldString1.Text = Properties.Settings.Default.oldString1; textBoxOldString2.Text = Properties.Settings.Default.oldString2; textBoxOldString3.Text = Properties.Settings.Default.oldString3; textBoxOldString4.Text = Properties.Settings.Default.oldString4; textBoxOldString5.Text = Properties.Settings.Default.oldString5; textBoxOldString6.Text = Properties.Settings.Default.oldString6; textBoxOldString7.Text = Properties.Settings.Default.oldString7; textBoxOldString8.Text = Properties.Settings.Default.oldString8; textBoxNewString1.Text = Properties.Settings.Default.newString1; textBoxNewString2.Text = Properties.Settings.Default.newString2; textBoxNewString3.Text = Properties.Settings.Default.newString3; textBoxNewString4.Text = Properties.Settings.Default.newString4; textBoxNewString5.Text = Properties.Settings.Default.newString5; textBoxNewString6.Text = Properties.Settings.Default.newString6; textBoxNewString7.Text = Properties.Settings.Default.newString7; textBoxNewString8.Text = Properties.Settings.Default.newString8; } } |
設定のためのフォームで置換元の文字列、置換後の文字列を入力したら、[確定]をクリックします。そして[確定]がクリックされたら設定を保存し、フォームを閉じます。[キャンセル]がクリックされたらなにもしないでフォームを閉じます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form2 : Form { private void button1_Click(object sender, EventArgs e) { Properties.Settings.Default.oldString1 = textBoxOldString1.Text; Properties.Settings.Default.oldString2 = textBoxOldString2.Text; Properties.Settings.Default.oldString3 = textBoxOldString3.Text; Properties.Settings.Default.oldString4 = textBoxOldString4.Text; Properties.Settings.Default.oldString5 = textBoxOldString5.Text; Properties.Settings.Default.oldString6 = textBoxOldString6.Text; Properties.Settings.Default.oldString7 = textBoxOldString7.Text; Properties.Settings.Default.oldString8 = textBoxOldString8.Text; Properties.Settings.Default.newString1 = textBoxNewString1.Text; Properties.Settings.Default.newString2 = textBoxNewString2.Text; Properties.Settings.Default.newString3 = textBoxNewString3.Text; Properties.Settings.Default.newString4 = textBoxNewString4.Text; Properties.Settings.Default.newString5 = textBoxNewString5.Text; Properties.Settings.Default.newString6 = textBoxNewString6.Text; Properties.Settings.Default.newString7 = textBoxNewString7.Text; Properties.Settings.Default.newString8 = textBoxNewString8.Text; Properties.Settings.Default.Save(); Close(); Dispose(); } private void buttonCancel_Click(object sender, EventArgs e) { Close(); Dispose(); } } |
親のフォームで[置換]がクリックされたら、設定されている文字列を利用して置換の処理をおこないます。一括置換ではなく確認をとりながら実行しています。
確認メッセージボックスで[No]が選択されたら次の候補へ移動、[キャンセル]がクリックされたら置換の処理を終了しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
class FindResult { public FindResult(string oldString, string newString, int start) { OldString = oldString; NewString = newString; Start = start; } public string OldString { get; } = ""; public string NewString { get; } = ""; public int Start { get; } = 0; public int Length { get { return OldString.Length; } } } public partial class Form1 : Form { private void buttonReplace_Click(object sender, EventArgs e) { string oldString1 = Properties.Settings.Default.oldString1; string oldString2 = Properties.Settings.Default.oldString2; string oldString3 = Properties.Settings.Default.oldString3; string oldString4 = Properties.Settings.Default.oldString4; string oldString5 = Properties.Settings.Default.oldString5; string oldString6 = Properties.Settings.Default.oldString6; string oldString7 = Properties.Settings.Default.oldString7; string oldString8 = Properties.Settings.Default.oldString8; string newString1 = Properties.Settings.Default.newString1; string newString2 = Properties.Settings.Default.newString2; string newString3 = Properties.Settings.Default.newString3; string newString4 = Properties.Settings.Default.newString4; string newString5 = Properties.Settings.Default.newString5; string newString6 = Properties.Settings.Default.newString6; string newString7 = Properties.Settings.Default.newString7; string newString8 = Properties.Settings.Default.newString8; int curStart = 0; while (true) { int start = -1; List<FindResult> finds = new List<FindResult>(); start = richTextBox1.Find(oldString1, curStart, RichTextBoxFinds.MatchCase); if (oldString1.Length != 0 && start != -1) finds.Add(new FindResult(oldString1, newString1, start)); start = richTextBox1.Find(oldString2, curStart, RichTextBoxFinds.MatchCase); if (oldString2.Length != 0 && start != -1) finds.Add(new FindResult(oldString2, newString2, start)); start = richTextBox1.Find(oldString3, curStart, RichTextBoxFinds.MatchCase); if (oldString3.Length != 0 && start != -1) finds.Add(new FindResult(oldString3, newString3, start)); start = richTextBox1.Find(oldString4, curStart, RichTextBoxFinds.MatchCase); if (oldString4.Length != 0 && start != -1) finds.Add(new FindResult(oldString4, newString4, start)); start = richTextBox1.Find(oldString5, curStart, RichTextBoxFinds.MatchCase); if (oldString5.Length != 0 && start != -1) finds.Add(new FindResult(oldString5, newString5, start)); start = richTextBox1.Find(oldString6, curStart, RichTextBoxFinds.MatchCase); if (oldString6.Length != 0 && start != -1) finds.Add(new FindResult(oldString6, newString6, start)); start = richTextBox1.Find(oldString7, curStart, RichTextBoxFinds.MatchCase); if (oldString7.Length != 0 && start != -1) finds.Add(new FindResult(oldString7, newString7, start)); start = richTextBox1.Find(oldString8, curStart, RichTextBoxFinds.MatchCase); if (oldString8.Length != 0 && start != -1) finds.Add(new FindResult(oldString8, newString8, start)); DialogResult dr = DialogResult.Cancel; if (finds.Count != 0) { int min = finds.Min(x => x.Start); var finds1 = finds.Where(x => x.Start == min).ToList(); foreach (var find in finds1) { richTextBox1.Select(find.Start, find.Length); string s = String.Format("「{0}」を「{1}」に置換", find.OldString, find.NewString); dr = MessageBox.Show(s, "", MessageBoxButtons.YesNoCancel); if (dr == DialogResult.Yes) richTextBox1.SelectedText = find.NewString; if (dr == DialogResult.Cancel) break; } if (dr == DialogResult.Cancel) break; curStart = finds1[0].Start + 1; } else break; } } } |
長い。もっとスマートに書けないものか?
置換しおわったデータをコピペしやすいようにクリップボードにコピーするボタンもつけてみました。
1 2 3 4 5 6 7 |
public partial class Form1 : Form { private void buttonCopy_Click(object sender, EventArgs e) { Clipboard.SetText(richTextBox1.Text); } } |