C# Tips | 文字列操作:前後の空白を削除する

Web APP C#
スポンサーリンク
スポンサーリンク
  1. C#で前後の空白を削除する方法
  2. Trimとは何か
    1. Trimは「前後」を削除する
  3. なぜ業務システムでTrimが必要なのか
  4. Trimの基本的な使い方
    1. 基本形
    2. 変数そのものをTrim後の値にする
    3. Trimしただけでは元の変数は変わらない
  5. TrimStartとTrimEnd
    1. TrimStart()
    2. TrimEnd()
  6. Trimで削除される「空白」とは
  7. 最重要:nullの文字列にTrimしない
    1. null条件演算子「?.」を使う
    2. nullなら空文字にしたい場合
  8. ユーザー入力をTrimする実務例
  9. 検索フォームでTrimする
  10. Trimと空文字・空白文字の関係
    1. null
    2. 空文字
    3. 空白だけの文字列
  11. 未入力チェックにはIsNullOrWhiteSpaceが便利
  12. Trimしてから判定するべきか、判定してからTrimするべきか
  13. Trimは文字列の途中の空白を削除しない
  14. 文字列の途中の空白を削除する処理とは別物
  15. すべての文字列をTrimしてよいわけではない
  16. データベースへ保存する前のTrim
    1. 保存時と表示時のどちらでTrimするのか
  17. Trimとセキュリティ対策は別に考える
  18. 実務で使える安全なTrimのテンプレート
    1. テンプレート1:nullなら空文字にする
    2. テンプレート2:未入力チェックをする
    3. テンプレート3:Trimしてから業務処理へ渡す
    4. テンプレート4:検索キーワードを整える
  19. Trimを共通ユーティリティにする
  20. Trimを使うときのチェックポイント
  21. 初心者がまず覚えるべき3つのコード
    1. 1.前後の空白を削除する
    2. 2.nullを考慮してTrimする
    3. 3.nullなら空文字、それ以外ならTrimする
  22. まとめ

C#で前後の空白を削除する方法

C#で業務システムを開発していると、ユーザーが入力した文字列の前後に余計な空白が入っていることがあります。

たとえば、名前を入力するフォームで次のような値が送られてきたとします。

  山田太郎  

見た目では「山田太郎」と入力したように見えても、実際の文字列には先頭と末尾に空白が含まれています。

このような前後の空白を削除するときに利用するのが、C#のTrim()メソッドです。

string name = "  山田太郎  ";

// 文字列の前後にある空白を削除する
string result = name.Trim();

Console.WriteLine(result);
C#

実行結果は次のようになります。

山田太郎

Trim()自体は非常に簡単ですが、実務で使う場合には「nullだったらどうするのか」「文字列の途中にある空白はどうするのか」「空白を削除してよいデータなのか」といった点まで考える必要があります。

この記事では、Trim()の基本から、TrimStart()やTrimEnd()との違い、nullを考慮した安全な書き方、ユーザー入力や検索キーワードなどの実務例、注意点まで順番に解説します。

Trimとは何か

Trimは、文字列の先頭と末尾にある空白文字を取り除くためのメソッドです。

基本的な書き方は次のとおりです。

string result = value.Trim();
C#

たとえば、次の文字列を考えてみます。

string value = "  C# Programming  ";

// 前後の空白を削除する
string result = value.Trim();

Console.WriteLine(result);
C#

結果は次のようになります。

C# Programming

元の文字列にあった先頭と末尾の空白が取り除かれています。

Trimは「前後」を削除する

Trimを理解するときに最も重要なのが、「Trimは文字列全体の空白を削除するわけではない」という点です。

次の文字列を見てみましょう。

string value = "  C#   Programming  ";

// 前後の空白を削除する
string result = value.Trim();

Console.WriteLine(result);
C#

結果は次のようになります。

C#   Programming

先頭と末尾の空白は削除されましたが、「C#」と「Programming」の間にある空白は残っています。

つまりTrim()は、次のような処理をします。

"  C#   Programming  "
^^                  ^^
↑                    ↑
先頭の空白           末尾の空白を削除

文字列の途中にある空白まで削除する処理ではありません。

なぜ業務システムでTrimが必要なのか

業務システムでは、文字列の前後に空白が入っていることで、思わぬ問題が発生することがあります。

たとえば、データベースに次の2つの値が登録されていたとします。

"山田太郎"
" 山田太郎"

人間が見ると同じ名前に見えますが、プログラムから見ると異なる文字列です。

検索処理でも同じ問題が起こります。

データベース:
"山田太郎"

ユーザー入力:
" 山田太郎 "

単純な文字列比較では一致しない可能性があります。

そこで、検索前に入力値をTrimします。

string input = " 山田太郎 ";

// 検索前に前後の空白を削除する
string keyword = input.Trim();

// keywordは「山田太郎」になる
SearchCustomer(keyword);
C#

このようにTrimは、単なる見た目の調整ではなく、入力値を一定のルールに整えるための処理として業務システムで利用できます。

Trimの基本的な使い方

基本形

最も基本的な形は次のとおりです。

string text = "  Hello World  ";

// 前後の空白を削除する
string result = text.Trim();

Console.WriteLine(result);
C#

結果は次のようになります。

Hello World

変数そのものをTrim後の値にする

Trim()は、元の文字列を直接書き換えるメソッドではありません。

そのため、Trim後の値を利用したい場合は、結果を変数に代入します。

string text = "  Hello World  ";

// Trimした結果を同じ変数へ再代入する
text = text.Trim();

Console.WriteLine(text);
C#

この場合、最終的なtextの値は次のようになります。

Hello World

Trimしただけでは元の変数は変わらない

次のコードには注意してください。

string text = "  Hello World  ";

// Trimの結果を受け取っていない
text.Trim();

// textにはまだ前後の空白が残っている
Console.WriteLine(text);
C#

「Trim()を呼び出したからtextの中身も変わった」と考えてしまうのは初心者によくある間違いです。

正しくは、次のように結果を受け取ります。

string text = "  Hello World  ";

// Trim後の文字列をtextへ再代入する
text = text.Trim();

Console.WriteLine(text);
C#

このポイントは非常に重要です。

TrimStartとTrimEnd

C#には、前後両方ではなく片側だけの空白を削除するメソッドもあります。

メソッド処理
Trim()先頭と末尾の空白を削除
TrimStart()先頭の空白を削除
TrimEnd()末尾の空白を削除

TrimStart()

TrimStart()は文字列の先頭にある空白を削除します。

string text = "  Hello World  ";

// 先頭の空白だけを削除する
string result = text.TrimStart();

Console.WriteLine(result);
C#

結果は次のようになります。

Hello World  

末尾の空白は残ります。

TrimEnd()

TrimEnd()は文字列の末尾にある空白を削除します。

string text = "  Hello World  ";

// 末尾の空白だけを削除する
string result = text.TrimEnd();

Console.WriteLine(result);
C#

結果は次のようになります。

  Hello World

通常のユーザー入力を整える場合はTrim()を使うことが多いですが、データの仕様によってはTrimStart()やTrimEnd()を使い分けます。

Trimで削除される「空白」とは

「空白」と聞くと、半角スペースだけを思い浮かべるかもしれません。

しかし、実際の文字列にはさまざまな空白文字が含まれることがあります。

たとえば、タブや改行などです。

string text = "\tHello World\n";

// 前後の空白文字を削除する
string result = text.Trim();

Console.WriteLine(result);
C#

このようにTrimは、単純に半角スペースだけを対象とする処理として考えるよりも、文字列の前後にある不要な空白文字を取り除く処理として理解するのがおすすめです。

最重要:nullの文字列にTrimしない

業務プログラムでTrimを使う場合、特に注意したいのがnullです。

たとえば次のようなコードがあります。

string? name = GetName();

// nameがnullの場合は問題になる可能性がある
string result = name.Trim();
C#

nameがnullの場合、Trim()を呼び出すことができません。

そのため、nullになる可能性がある文字列に対しては、nullを考慮したコードを書く必要があります。

null条件演算子「?.」を使う

簡潔に書くなら、null条件演算子を使えます。

string? name = GetName();

// nameがnullでなければTrim()を実行する
// nameがnullなら結果もnullになる
string? result = name?.Trim();
C#

このコードは、次のような意味になります。

nameがnullではない
    ↓
Trim()を実行

nameがnull
    ↓
Trim()を実行しない
    ↓
結果はnull

nullなら空文字にしたい場合

業務処理によっては、「nullなら空文字として扱いたい」という場合があります。

その場合は、null合体演算子??を組み合わせます。

string? input = GetInput();

// nullなら空文字、それ以外ならTrimする
string value = input?.Trim() ?? "";
C#

この1行は、実務で非常によく使えるテンプレートです。

意味としては、次のとおりです。

inputがnullではない
    ↓
Trim()する
    ↓
結果をvalueに入れる

inputがnull
    ↓
Trim()しない
    ↓
空文字""をvalueに入れる

ユーザー入力をTrimする実務例

ここからは、実際の業務システムを想定して考えてみます。

たとえば顧客登録画面で、顧客名を入力してもらうとします。

ユーザーが次のように入力したとします。

  山田太郎  

この値をそのまま保存するのではなく、前後の空白を削除します。

string? customerName = GetCustomerName();

// 顧客名の前後にある空白を削除する
string name = customerName?.Trim() ?? "";

// 未入力の場合はエラーにする
if (string.IsNullOrWhiteSpace(name))
{
    Console.WriteLine("顧客名を入力してください。");
    return;
}

// Trim済みの顧客名を保存する
SaveCustomer(name);
C#

このように、

  1. 入力値を受け取る
  2. 前後の空白を削除する
  3. 未入力か確認する
  4. 問題がなければ保存する

という流れにすると、処理が分かりやすくなります。

検索フォームでTrimする

検索フォームもTrimが活躍する代表的な場所です。

ユーザーが検索ボックスに次のように入力したとします。

  東京  

検索処理の前にTrimしておけば、検索キーワードを整えられます。

string? input = GetSearchKeyword();

// 検索キーワードの前後の空白を削除する
string keyword = input?.Trim() ?? "";

// 未入力なら検索処理を行わない
if (string.IsNullOrWhiteSpace(keyword))
{
    Console.WriteLine("検索キーワードを入力してください。");
    return;
}

// Trim済みのキーワードで検索する
Search(keyword);
C#

このような「検索前の入力値の正規化」は、実務でよく登場するパターンです。

Trimと空文字・空白文字の関係

Trimを理解するためには、次の3つを区別することも重要です。

null
""
"   "

これらはすべて同じではありません。

null

nullは、文字列そのものが存在しない状態です。

string? value = null;
C#

空文字

空文字は、文字列は存在しますが、文字数が0の状態です。

string value = "";
C#

空白だけの文字列

空白だけの文字列は、文字列としては存在しますが、中身が空白だけです。

string value = "   ";
C#

この空白だけの文字列にTrimを実行すると、空文字になります。

string value = "   ";

// 前後の空白を削除する
string result = value.Trim();

// 結果は空文字になる
Console.WriteLine(result.Length);
C#

結果は0です。

つまり、次のような変化になります。

"   "
  ↓ Trim()
""

未入力チェックにはIsNullOrWhiteSpaceが便利

「ユーザーが実質的に何も入力していないか」を確認したい場合は、Trimしてから判定する方法だけでなく、string.IsNullOrWhiteSpace()を利用する方法があります。

string? input = GetInput();

// null、空文字、空白だけの場合はtrue
if (string.IsNullOrWhiteSpace(input))
{
    Console.WriteLine("入力してください。");
    return;
}

// ここに来た時点で、空白だけではない入力がある
Console.WriteLine("入力されています。");
C#

これは入力チェックでは非常に便利です。

たとえば、次のような値をすべて「未入力」として扱えます。

null
""
"   "

そのため、

if (string.IsNullOrWhiteSpace(input))
{
    // 未入力として処理
}
C#

という形は、業務システムでも覚えておきたい基本パターンです。

Trimしてから判定するべきか、判定してからTrimするべきか

初心者の方からすると、次の2つはどちらも同じように見えるかもしれません。

// パターン1
string value = input?.Trim() ?? "";

if (value.Length == 0)
{
    // 未入力
}
C#

もう一つは次の方法です。

// パターン2
if (string.IsNullOrWhiteSpace(input))
{
    // 未入力
    return;
}

string value = input.Trim();
C#

どちらを使うかは、後続処理で「Trim済みの値を使いたいのか」「未入力かどうかだけを知りたいのか」によって決められます。

未入力判定だけが目的なら、IsNullOrWhiteSpace()のほうがコードから意図を読み取りやすい場合があります。

一方、Trim済みの値をそのまま後続処理に渡したいなら、次のような書き方が便利です。

string value = input?.Trim() ?? "";

// Trim後の値を使って処理を続ける
Process(value);
C#

Trimは文字列の途中の空白を削除しない

Trimの名前から、「文字列に含まれる空白を全部削除する」と誤解してしまうことがあります。

しかし、それはTrimの役割ではありません。

たとえば次のコードです。

string name = "山田 太郎";

// 前後の空白だけを削除する
string result = name.Trim();

Console.WriteLine(result);
C#

結果は次のとおりです。

山田 太郎

中央にある空白は残ります。

これは正常な動作です。

名前のように「姓と名の間に空白が入ることがあるデータ」では、むしろ中央の空白を勝手に削除してはいけない場合があります。

文字列の途中の空白を削除する処理とは別物

もし文字列の途中にある空白まで削除したいのであれば、それはTrimとは異なる処理です。

たとえば、すべての半角スペースを削除する処理なら次のような方法があります。

string value = "山田 太郎";

// 半角スペースをすべて削除する
string result = value.Replace(" ", "");

Console.WriteLine(result);
C#

結果は次のようになります。

山田太郎

ただし、これはTrimとは目的が異なります。

  • Trim() → 前後の空白を削除
  • Replace(” “, “”) → 指定した半角スペースをすべて削除

業務システムでは、この違いを理解して使い分けることが重要です。

すべての文字列をTrimしてよいわけではない

業務アプリケーションを設計するときに非常に重要なのが、「前後の空白を削除してよいデータなのか」を判断することです。

たとえば顧客名や検索キーワードでは、前後の空白を不要なものとして扱える場合があります。

一方で、文章や自由記述欄などでは、入力された文字列をそのまま保持したい場合があります。

たとえば、次のようなデータです。

string document = "  これは重要な文章です。  ";
C#

このデータについて、前後の空白を削除することが業務上正しいとは限りません。

そのため、単純に次のような処理をシステム全体へ適用するのは避けるべきです。

// すべての文字列を無条件にTrimする設計は要注意
value = value.Trim();
C#

重要なのは、データの意味に応じてTrimするかどうかを決めることです。

データベースへ保存する前のTrim

業務システムでは、データベースへ値を保存する前にTrimすることがあります。

たとえば顧客名です。

string? customerName = GetCustomerName();

// 保存前に前後の空白を削除する
string normalizedName = customerName?.Trim() ?? "";

// 顧客名を保存する
SaveCustomerName(normalizedName);
C#

これにより、前後に不要な空白が入ったデータが保存されることを防ぎやすくなります。

ただし、ここでも「本当にTrimしてよい項目なのか」を仕様として確認する必要があります。

保存時と表示時のどちらでTrimするのか

Trimするタイミングにはいくつかの考え方があります。

代表的なのは次の2つです。

入力時
 ↓
Trim
 ↓
保存

もう一つは、元データを保持し、表示や検索など必要な場面だけ整形する方法です。

入力
 ↓
元データを保持
 ↓
表示・検索時に必要に応じて整形

どちらが正しいかはデータの性質や業務要件によって異なります。

「入力された原文を保存する必要があるのか」「正規化された値だけあればよいのか」を決めてから実装することが大切です。

Trimとセキュリティ対策は別に考える

Trimは入力値を整えるための便利な処理ですが、Trimしただけで入力値が安全になるわけではありません。

たとえばSQLインジェクション対策を考える場合、次のような文字列連結を避けることが重要です。

// 注意:入力値をSQL文字列へ直接連結する方法は避ける
string sql = "SELECT * FROM Users WHERE Name = '" + value + "'";
C#

データベースへアクセスする場合は、利用しているデータアクセス技術に応じて、パラメータ化クエリなどの適切な方法を利用します。

Trimとセキュリティ対策は次のように分けて考えると分かりやすくなります。

  • Trim → 前後の空白を削除して入力値を整える
  • 入力検証 → 値が業務上正しい形式か確認する
  • パラメータ化 → SQLなどの外部処理へ安全に値を渡す
  • エンコード → HTMLなどの出力先に応じて適切に文字列を扱う

つまり、Trimはセキュリティ対策の一部ではあっても、セキュリティ対策そのものではありません。

実務で使える安全なTrimのテンプレート

ここまでの内容を使って、業務で使いやすいテンプレートを整理します。

テンプレート1:nullなら空文字にする

// nullなら空文字、それ以外なら前後の空白を削除する
string value = input?.Trim() ?? "";
C#

「後続処理では必ずstringとして扱いたい」という場合に便利です。

テンプレート2:未入力チェックをする

// null、空文字、空白だけの場合は未入力
if (string.IsNullOrWhiteSpace(input))
{
    Console.WriteLine("入力してください。");
    return;
}
C#

テンプレート3:Trimしてから業務処理へ渡す

string? input = GetInput();

// nullを考慮しながら前後の空白を削除する
string value = input?.Trim() ?? "";

// 未入力なら処理を中止する
if (value.Length == 0)
{
    Console.WriteLine("入力してください。");
    return;
}

// 整形済みの値を業務処理へ渡す
Process(value);
C#

テンプレート4:検索キーワードを整える

string? input = GetSearchKeyword();

// 検索キーワードの前後の空白を削除する
string keyword = input?.Trim() ?? "";

// キーワードが空なら検索しない
if (keyword.Length == 0)
{
    Console.WriteLine("検索キーワードを入力してください。");
    return;
}

// 検索処理
Search(keyword);
C#

Trimを共通ユーティリティにする

同じ処理をアプリケーションの多くの場所で使用する場合は、共通メソッドとして切り出す方法もあります。

public static class StringUtility
{
    /// <summary>
    /// nullなら空文字、それ以外なら前後の空白を削除します。
    /// </summary>
    public static string SafeTrim(string? value)
    {
        // nullの場合は空文字を返す
        if (value == null)
        {
            return "";
        }

        // nullではない場合はTrimして返す
        return value.Trim();
    }
}
C#

呼び出す側は次のようになります。

string? input = GetInput();

// SafeTrimでnullを考慮しながら前後の空白を削除する
string value = StringUtility.SafeTrim(input);

Console.WriteLine(value);
C#

ただし、C#には標準でTrim()やnull条件演算子などが用意されています。

そのため、単純な処理をすべて独自ユーティリティへ置き換える必要はありません。

「SafeTrim」という名前に業務上の意味を持たせたい場合や、プロジェクト全体で独自ルールを統一したい場合などに共通化を検討するとよいでしょう。

Trimを使うときのチェックポイント

実際の業務コードへTrimを追加するときは、次のチェックリストを確認すると安全です。

  • この文字列はnullになる可能性がありますか?
  • nullの場合はどう扱いますか?
  • 前後の空白を削除しても問題ありませんか?
  • 文字列の途中にある空白は残す必要がありますか?
  • 空白だけの入力を未入力として扱いますか?
  • Trimした結果を変数へ代入していますか?
  • データベースへ保存する場合、Trimのタイミングは適切ですか?
  • Trim以外に必要な入力検証はありませんか?
  • 外部システムへ値を渡す場合、適切なセキュリティ対策をしていますか?

初心者がまず覚えるべき3つのコード

最初からすべてを覚える必要はありません。

まずは次の3つを覚えると、実務でもかなり応用できます。

1.前後の空白を削除する

string result = value.Trim();
C#

2.nullを考慮してTrimする

// nullならTrimせず、結果もnullにする
string? result = value?.Trim();
C#

3.nullなら空文字、それ以外ならTrimする

// nullなら空文字にする
string result = value?.Trim() ?? "";
C#

そして、未入力チェックをするときは次のコードを覚えておくと便利です。

// null、空文字、空白だけなら未入力
if (string.IsNullOrWhiteSpace(value))
{
    // 未入力として処理する
}
C#

まとめ

C#で文字列の前後にある空白を削除する場合は、基本的にTrim()を使用します。

最も基本的なコードは次のとおりです。

string value = "  C#  ";

// 前後の空白を削除する
value = value.Trim();
C#

Trim()を使うときに特に重要なのは、次のポイントです。

  • Trim()は文字列の前後の空白を削除する
  • 文字列の途中にある空白は削除しない
  • TrimStart()は先頭だけを削除する
  • TrimEnd()は末尾だけを削除する
  • Trim()の戻り値を変数へ代入する必要がある
  • nullになる可能性がある文字列には注意する
  • value?.Trim()でnullを考慮できる
  • value?.Trim() ?? ""でnullを空文字にできる
  • 未入力判定にはstring.IsNullOrWhiteSpace()が便利
  • すべての文字列を無条件にTrimしてよいとは限らない
  • Trimはセキュリティ対策そのものではない

特に実務では、次のコードを基本テンプレートとして覚えておくと便利です。

// nullなら空文字、それ以外なら前後の空白を削除する
string value = input?.Trim() ?? "";

// 未入力なら処理を中止する
if (value.Length == 0)
{
    Console.WriteLine("入力してください。");
    return;
}

// 整形済みの値を業務処理へ渡す
Process(value);
C#

ただし、最も大切なのは「Trimの書き方を暗記すること」ではありません。

そのデータについて、前後の空白を削除してよいのか、nullをどう扱うのか、空白だけの入力をどう扱うのかを業務仕様として明確にすることです。

この考え方を身につけておくと、顧客名、住所、検索キーワード、メールアドレス、コード値、設定値など、さまざまな業務データを扱う場面でTrimを適切に利用できるようになります。

タイトルとURLをコピーしました