2020年10月24日
川俣晶の縁側ソフトウェアC# コーディング How To total 766 count

【入門級】文字列中のAをBに、BをAに置き換える

Written By: 川俣 晶連絡先

文字の入れ替えは面倒 §

 "たろうくんの英語はA、国語はB"という文字列で、あとからAとBが反対であると発覚したとします。文字を置き換えるプログラムは簡単に書けるでしょうか。

 s.Replace('A', 'B').Replace('B', 'A')はダメな例です。Replace('A', 'B')を実行した時点で全てのAはBになってしまい、BはBのままですから区別できなくなります。そして、Replace('B', 'A')で全てAに置き換えられます。

 s.Replace('A', '\0').Replace('B', 'A').Replace('\0', 'B');は良い例です。\0は通常使用しない文字です。一時的にAをそれに置き換え、BをAに置き換えた後でBに置き換えています。

 しかし、【一時的に使用して良い文字】がない場合は、コツコツと地道に置き換えていくしかありません。サンプルソースのforeachを使った処理は一例です。他の方法でも構いません。

罠の数々 §

  • '\0'は2文字ではない。円記号(バックスラッシュ)を前置するのは、特殊文字を表記する方法。

参考リンク §

String.Replace メソッド

 String.Replace メソッドには、他にもいろいろなバリエーションがある。もし、"たろうくんの英語はA、国語はB"の【たろうくん】を【はなこさん】に置き換えるとしたら、どのバリエーションを使えば効率が良いか、上記のリンクから辿って考えてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

SwapChar §

using System;

using System.Text;

class Program

{

    static void Main()

    {

        var s = "たろうくんの英語はA、国語はB";

        var bad = s.Replace('A', 'B').Replace('B', 'A');

        Console.WriteLine($"ダメなケース {bad}");

        var good1 = s.Replace('A', '\0').Replace('B', 'A').Replace('\0', 'B');

        Console.WriteLine($"良いケース1 {good1}");

        var good2 = new StringBuilder();

        foreach (var item in s) good2.Append(item switch { 'A' => 'B', 'B' => 'A', _ => item });

        Console.WriteLine($"良いケース2 {good2.ToString()}");

    }

}

実行結果

ダメなケース たろうくんの英語はA、国語はA

良いケース1 たろうくんの英語はB、国語はA

良いケース2 たろうくんの英語はB、国語はA

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?