C# Tips | 文字列操作:英数字だけ抽出する

Web APP C#
スポンサーリンク
スポンサーリンク
  1. C#で文字列から英数字だけを抽出する基本
  2. まず理解したい「英数字だけ抽出する」とは何か
  3. 最初に覚えたい char.IsLetterOrDigit() を使う方法
  4. StringBuilder を使う理由も理解しておきましょう
  5. ただし char.IsLetterOrDigit() には注意点があります
  6. 半角英数字だけを抽出したいならASCII範囲で判定する
  7. まずは簡単な例題で慣れましょう
    1. 例題1: 会員IDから記号を除去する
    2. 例題2: 商品コードを比較用に整形する
  8. null と空文字の扱いは必ず考えましょう
    1. 安全な書き方1: 事前にチェックする
    2. 安全な書き方2: ユーティリティメソッドにまとめる
  9. LINQを使うと短く書けます
  10. Regexを使う方法もあります
  11. どの方法を選べばよいのか
  12. 実務で特に注意したいポイント
    1. char.IsLetterOrDigit() をそのまま使うと日本語が残ることがある
    2. 全角英数字はそのままだと除外される
    3. 大文字小文字の統一をセットで考える
    4. 元の入力値を消さないほうがよい場合がある
  13. 業務で使いやすいユーティリティメソッドにまとめる
    1. シンプルな半角英数字抽出ユーティリティ
    2. 比較向けに大文字統一するテンプレート
    3. 全角英数字が混ざる入力を想定したテンプレート
  14. パフォーマンスの考え方も少し知っておきましょう
  15. セキュリティと品質の観点でも重要です
  16. よくある失敗と注意点
    1. 「英数字だけ」と言いながら日本語が残ってしまう
    2. 全角英数字を想定していない
    3. 大文字小文字の揺れを放置する
    4. null や空文字を考慮しない
  17. まとめ

C#で文字列から英数字だけを抽出する基本

C#で文字列から英数字だけを抽出したい場面は、業務システムではとてもよくあります。たとえば、会員IDや社員番号の入力から記号や空白を除きたいとき、商品コードを比較しやすい形へ整えたいとき、外部システム連携用に文字種を制限したいとき、あるいはCSV取込データから不要文字を取り除きたいときなどです。見た目は単純な処理に見えますが、実務では「何を残して何を除去するか」「全角英数字をどう扱うか」「大文字小文字をどう統一するか」「元データを残すべきか」といった重要な判断が必要になります。

初心者の方が最初に理解しておきたいのは、「英数字だけ抽出する」という処理は、単に文字を減らすテクニックではなく、データを業務で使いやすい形に整える正規化処理だということです。つまり、ただ動けばよいのではなく、何のために整形するのかを考えて実装することが大切です。ここを意識できるかどうかで、実務でのコード品質が大きく変わります。

C#では、この処理を実現する方法がいくつかあります。代表的には次のような方法があります。

  • char.IsLetterOrDigit() を使って1文字ずつ判定する方法
  • LINQ を使って短く書く方法
  • Regex を使って英数字以外をまとめて除去する方法

初心者の方には、まず char.IsLetterOrDigit() を使って1文字ずつ見ていく方法から理解するのがおすすめです。この方法は、どの文字を残し、どの文字を捨てているのかが目で追いやすく、文字列操作の基礎がしっかり身につくからです。

まず理解したい「英数字だけ抽出する」とは何か

「英数字だけ抽出する」とは、文字列の中に含まれている文字を1文字ずつ調べて、その中で英字と数字だけを残し、それ以外の文字を除外することです。

たとえば、次のような文字列があったとします。

  • ABC-123
  • user_name_001
  • 商品CD: AB-999X

これらから英数字だけを取り出すと、結果は次のようになります。

  • ABC-123 → ABC123
  • user_name_001 → username001
  • 商品CD: AB-999X → 商品CDAB999X ではなく、条件次第で結果が変わります

ここで重要なのは、「英数字」という言葉をどう解釈するかです。初心者の方が最初に混乱しやすいのはこの部分です。たとえば、char.IsLetterOrDigit() は「英字と数字」だけではなく、日本語などの文字も「文字」として判定することがあります。つまり、業務で本当に欲しいのが「ASCIIの半角英数字だけ」なのか、「あらゆる文字と数字を許す」のかを明確にしないと、思った結果にならないことがあります。

このため、最初に次の視点を持つことが大切です。

  • 半角英字と半角数字だけ残したいのか
  • 全角英数字も許可したいのか
  • 日本語の文字は除外したいのか
  • アンダースコアやハイフンも残したいのか

実務では、この定義があいまいなまま実装すると、後で必ずトラブルになります。

最初に覚えたい char.IsLetterOrDigit() を使う方法

初心者の方にまず知ってほしいのが、char.IsLetterOrDigit() を使って1文字ずつ確認する方法です。これは「その文字が文字または数字なら残す」という考え方です。

基本のコードを見てみましょう。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string input = "ABC-123";
        StringBuilder result = new StringBuilder();

        // 文字列を1文字ずつ確認する</em>
        foreach (char c in input)
        {
            // 英字または数字なら結果に追加する</em>
            if (char.IsLetterOrDigit(c))
            {
                result.Append(c);
            }
        }

        Console.WriteLine("元の文字列: " + input);
        Console.WriteLine("英数字だけ抽出: " + result.ToString());
    }
}
C#

このコードでは、文字列を1文字ずつ取り出し、その文字が英字または数字なら StringBuilder に追加しています。結果として、ABC-123 から ABC123 が得られます。

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

元の文字列: ABC-123
英数字だけ抽出: ABC123
C#

この方法の良いところは、処理の流れがとても分かりやすいことです。

  • 1文字ずつ見る
  • 英字または数字かを判定する
  • 条件に合うものだけ残す

初心者の方は、まずこの流れをしっかり理解することが重要です。

StringBuilder を使う理由も理解しておきましょう

上のコードでは、結果をためるために StringBuilder を使っています。ここも実務で非常に大切な考え方です。

文字列は変更不可なので、result += c; のように繰り返し連結すると、そのたびに新しい文字列が作られます。少量データなら大きな問題にならないこともありますが、入力文字数が増えたり、処理回数が増えたりすると無駄が大きくなります。StringBuilder は、こうした「少しずつ文字を追加していく処理」に向いています。

次のような書き方もできます。

using System;

class Program
{
    static void Main()
    {
        string input = "ABC-123";
        string result = "";

        // 英数字だけ文字列連結で作る</em>
        foreach (char c in input)
        {
            if (char.IsLetterOrDigit(c))
            {
                result += c;
            }
        }

        Console.WriteLine(result);
    }
}
C#

このコードも動きますが、実務では繰り返し連結より StringBuilder を選ぶほうが安心です。初心者のうちから「繰り返しの中で文字列を作るなら、効率も少し意識する」と覚えておくと役立ちます。

ただし char.IsLetterOrDigit() には注意点があります

ここはとても重要です。名前だけ見ると「英数字だけ」と思いやすいのですが、char.IsLetterOrDigit() は厳密には「文字または数字かどうか」を判定します。そのため、日本語の文字も「文字」として扱われる場合があります。

たとえば、次のコードを見てください。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string input = "商品ABC123";
        StringBuilder result = new StringBuilder();

        // 文字または数字なら追加する</em>
        foreach (char c in input)
        {
            if (char.IsLetterOrDigit(c))
            {
                result.Append(c);
            }
        }

        Console.WriteLine(result.ToString());
    }
}
C#

このコードでは、商品 も文字として判定されるため、結果は 商品ABC123 になります。もし本当に欲しいのが「半角英字と半角数字だけ」であれば、この方法だけでは不十分です。

ここは初心者の方が実務でつまずきやすい重要ポイントです。業務で「英数字だけ」と言われた場合、多くは「半角の A-Z、a-z、0-9 だけ」を意味します。つまり、日本語や全角文字は含めたくないことが多いです。

半角英数字だけを抽出したいならASCII範囲で判定する

実務で本当に欲しいことが多いのは、「半角英数字だけ」を残す処理です。その場合は、文字コードの範囲を明示して判定するほうが安全です。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string input = "商品ABC123_ABC";
        StringBuilder result = new StringBuilder();

        // 1文字ずつ確認する</em>
        foreach (char c in input)
        {
            // 半角英大文字、半角英小文字、半角数字だけを許可する</em>
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        Console.WriteLine("元の文字列: " + input);
        Console.WriteLine("半角英数字のみ: " + result.ToString());
    }
}
C#

このコードなら、日本語や全角英数字は除外され、半角の英数字だけが残ります。実務でID、コード、キー、ログイン名などを整形するなら、この考え方が非常に重要です。

まずは簡単な例題で慣れましょう

ここでは、業務でありがちな場面を意識しながら、初心者向けに段階的に見ていきます。

例題1: 会員IDから記号を除去する

会員IDが画面入力されるとき、ハイフンや空白が混ざることがあります。そのままでは比較しづらいため、半角英数字だけにそろえることがあります。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string memberId = "AB-123-XY";
        StringBuilder result = new StringBuilder();

        // 半角英数字だけを抽出する</em>
        foreach (char c in memberId)
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        Console.WriteLine("入力値: " + memberId);
        Console.WriteLine("整形後: " + result.ToString());
    }
}
C#

このようにすると、AB-123-XY から AB123XY を作れます。

例題2: 商品コードを比較用に整形する

商品コードでは、大文字小文字の揺れも問題になることがあります。そういう場合は、英数字抽出に加えて大文字へ統一することがあります。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string productCode = "ab-123-xY";
        StringBuilder result = new StringBuilder();

        // 半角英数字だけを抽出する</em>
        foreach (char c in productCode)
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        // 比較しやすいように大文字へ統一する</em>
        string normalizedCode = result.ToString().ToUpperInvariant();

        Console.WriteLine("入力値: " + productCode);
        Console.WriteLine("整形後: " + normalizedCode);
    }
}
C#

このように、英数字抽出と大文字統一を組み合わせることで、比較や検索に強い形にできます。

null と空文字の扱いは必ず考えましょう

ここも実務では非常に大事です。画面入力、CSV、API、データベースなどでは、値が入っていないことは珍しくありません。null を考えずに処理を書くと、すぐにエラーの原因になります。

危険な例です。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string input = null;
        StringBuilder result = new StringBuilder();

        // inputがnullだとforeachでエラーになる</em>
        foreach (char c in input)
        {
            if (char.IsLetterOrDigit(c))
            {
                result.Append(c);
            }
        }

        Console.WriteLine(result.ToString());
    }
}
C#

このコードでは、input が null の時点で処理が失敗します。

安全な書き方1: 事前にチェックする

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string input = null;

        // nullまたは空文字なら処理を中断する</em>
        if (string.IsNullOrEmpty(input))
        {
            Console.WriteLine("入力値がありません。");
            return;
        }

        StringBuilder result = new StringBuilder();

        // 半角英数字だけを抽出する</em>
        foreach (char c in input)
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        Console.WriteLine(result.ToString());
    }
}
C#

この形は基本ですが、安全です。

安全な書き方2: ユーティリティメソッドにまとめる

実務では、何度も同じ処理を書くより、共通メソッド化したほうが使いやすくなります。

using System.Text;

public static class StringUtility
{
    // 文字列から半角英数字だけを抽出する</em>
    public static string ExtractAlphaNumeric(string input)
    {
        // nullまたは空文字なら空文字を返す</em>
        if (string.IsNullOrEmpty(input))
        {
            return string.Empty;
        }

        StringBuilder result = new StringBuilder();

        // 半角英数字だけを残す</em>
        foreach (char c in input)
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        return result.ToString();
    }
}
C#

こうしておくと、業務コードがすっきりしやすくなります。

LINQを使うと短く書けます

C#に慣れてきたら、LINQを使う方法も便利です。

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        string input = "AB-123-XY";

        // 半角英数字だけを抽出する</em>
        string result = new string(
            input.Where(c =>
                (c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            .ToArray());

        Console.WriteLine(result);
    }
}
C#

短く書けるのは魅力ですが、初心者の方には少し抽象的です。何をしているのかを説明できるようになってから使うとよいです。

Regexを使う方法もあります

英数字以外をまとめて除去したい場合は、正規表現も選択肢になります。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string input = "AB-123-XY";

        // 半角英数字以外を空文字に置き換える</em>
        string result = Regex.Replace(input, "[^A-Za-z0-9]", "");

        Console.WriteLine(result);
    }
}
C#

このコードでは、[^A-Za-z0-9] が「A-Z、a-z、0-9 以外の文字」を意味しています。それを空文字に置き換えることで、半角英数字だけを残しています。

実務では便利ですが、正規表現は慣れないと読みにくくなりやすいです。初心者の方は、まず条件分岐で理解してから使うほうが安心です。

どの方法を選べばよいのか

ここは実務で大切な考え方です。目的に応じて方法を選びます。

  • 処理を理解しやすくしたいなら foreach と範囲判定
  • 短く書きたいなら LINQ
  • 置換ベースで一気に処理したいなら Regex

初心者向け、保守性重視なら、まずは foreach 版がおすすめです。多少長くても、何をしているかがすぐ分かるコードのほうが、実務ではむしろ価値があります。

実務で特に注意したいポイント

ここは深掘りして理解しておきたい重要部分です。

char.IsLetterOrDigit() をそのまま使うと日本語が残ることがある

先ほど説明した通り、これは初心者が特に注意したい点です。業務で「英数字だけ」と言われたら、多くの場合は半角英数字を意味します。日本語や全角英数字を残したくないなら、ASCII範囲で判定する必要があります。

全角英数字はそのままだと除外される

半角英数字だけを許可するコードでは、全角の ABC123 は除外されます。もし入力に全角が混ざる可能性があるなら、事前に半角変換する設計も考える必要があります。

大文字小文字の統一をセットで考える

比較や検索では、英数字だけ抽出したあとに ToUpperInvariant() や ToLowerInvariant() でそろえることが多いです。抽出だけして終わりではなく、その後の利用方法まで考えることが大切です。

元の入力値を消さないほうがよい場合がある

入力値を整形して使うのは便利ですが、ユーザーが入力した元の値を証跡として残したい場合もあります。そのため、表示用・保存用・比較用を分けて考えるのが安全です。

業務で使いやすいユーティリティメソッドにまとめる

実務では、よく使う処理は共通化しておくのが基本です。

シンプルな半角英数字抽出ユーティリティ

using System.Text;

public static class StringUtility
{
    // 半角英数字だけを抽出する</em>
    public static string ExtractAlphaNumeric(string input)
    {
        // nullまたは空文字なら空文字を返す</em>
        if (string.IsNullOrEmpty(input))
        {
            return string.Empty;
        }

        StringBuilder result = new StringBuilder();

        // 半角英数字のみ追加する</em>
        foreach (char c in input)
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        return result.ToString();
    }
}
C#

比較向けに大文字統一するテンプレート

using System.Text;

public static class StringUtility
{
    // 比較しやすいように半角英数字だけ抽出して大文字化する</em>
    public static string NormalizeCode(string input)
    {
        // nullまたは空白だけなら空文字を返す</em>
        if (string.IsNullOrWhiteSpace(input))
        {
            return string.Empty;
        }

        StringBuilder result = new StringBuilder();

        // 半角英数字だけ抽出する</em>
        foreach (char c in input.Trim())
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        // 比較しやすいように大文字へ統一する</em>
        return result.ToString().ToUpperInvariant();
    }
}
C#

全角英数字が混ざる入力を想定したテンプレート

using System.Text;
using Microsoft.VisualBasic;

public static class StringUtility
{
    // 全角英数字を半角へ寄せたうえで半角英数字だけを抽出する</em>
    public static string NormalizeCodeFromWideInput(string input)
    {
        >// nullまたは空白だけなら空文字を返す</em>
        if (string.IsNullOrWhiteSpace(input))
        {
            return string.Empty;
        }

        // 全角英数字を半角へ変換する</em>
        string normalizedInput = Strings.StrConv(input.Trim(), VbStrConv.Narrow);

        StringBuilder result = new StringBuilder();

        // 半角英数字だけ抽出する</em>
        foreach (char c in normalizedInput)
        {
            if ((c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') ||
                (c >= '0' && c <= '9'))
            {
                result.Append(c);
            }
        }

        return result.ToString().ToUpperInvariant();
    }
}
C#

このように、実務要件に合わせて少しずつ強化したテンプレートを持っておくと便利です。

パフォーマンスの考え方も少し知っておきましょう

初心者のうちは、まず正しく動くことが最優先です。ただし、実務では大量データを処理することもあるため、少しだけ効率も意識しておくと役立ちます。

  • 繰り返し連結より StringBuilder を使う
  • 同じ入力に対して何度も同じ抽出処理をしない
  • 結果を一度変数に入れて使い回す

たとえば、同じ値を何度も整形するのは無駄です。

悪い例です。

using System;

class Program
{
    static void Main()
    {
        string input = "AB-123-XY";

        Console.WriteLine(StringUtility.ExtractAlphaNumeric(input));
        Console.WriteLine(StringUtility.ExtractAlphaNumeric(input));
    }
}
C#

改善例です。

using System;

class Program
{
    static void Main()
    {
        string input = "AB-123-XY";

        // 一度だけ整形して使い回す</em>
        string normalized = StringUtility.ExtractAlphaNumeric(input);

        Console.WriteLine(normalized);
        Console.WriteLine(normalized);
    }
}
C#

このような意識は、小さな改善ですが、積み重なると保守性にも効いてきます。

セキュリティと品質の観点でも重要です

英数字だけ抽出する処理は、入力の揺れを抑えるうえで有効です。しかし、元の値をそのまま保持すべきケースもあります。たとえば、監査ログ、申込原文、ユーザー入力履歴などでは、加工前の値も重要です。

そのため、実務では次のように役割を分けて考えるのが安全です。

  • 元の入力値はそのまま保存する
  • 比較用・検索用として整形後の値を別に持つ
  • 表示用は必要に応じてさらに整える

また、英数字だけに整形したからといって、その値が必ず正しいとは限りません。桁数、接頭辞、フォーマットなど、業務ルールに基づくバリデーションは別途必要です。

よくある失敗と注意点

「英数字だけ」と言いながら日本語が残ってしまう

これは char.IsLetterOrDigit() をそのまま使ったときに起こりやすい失敗です。本当に欲しいのが半角英数字だけなら、ASCII範囲で判定しましょう。

全角英数字を想定していない

ユーザー入力では全角が混ざることがあります。必要なら先に半角へ正規化する設計を考えましょう。

大文字小文字の揺れを放置する

比較や検索では、抽出後に大文字か小文字へ統一することが多いです。使い道まで考えて設計することが大切です。

null や空文字を考慮しない

実務では必ず出てきます。共通化の段階で安全に処理できるようにしておくと安心です。

まとめ

C#で文字列から英数字だけを抽出する処理は、会員ID、商品コード、外部連携用キー、CSV取込データの整形など、実務で非常によく使います。初心者の方は、まず1文字ずつ確認しながら条件に合う文字だけを残す方法から理解するのがおすすめです。その際、単に char.IsLetterOrDigit() を使うだけではなく、本当に欲しいのが「半角英数字だけ」なのかを明確にすることが重要です。

特に大切なのは次の点です。

  • 英数字抽出は単なる文字削除ではなく、正規化処理であること
  • char.IsLetterOrDigit() は日本語も含む可能性があること
  • 本当に半角英数字だけが必要ならASCII範囲で判定すること
  • null や空文字を安全に扱うこと
  • 必要に応じて全角から半角への変換も組み合わせること
  • 比較や検索では大文字小文字の統一も検討すること
  • よく使う処理はユーティリティ化して再利用すること

初心者の方は、まず「どうやって英数字だけを残すか」だけでなく、「なぜその形に整えるのか」「その後にどう使うのか」まで意識できるようになると、実務で通用する設計力が身につきやすくなります。英数字抽出は小さな処理に見えて、入力品質、検索精度、外部連携の安定性に大きく関わる大事な基礎です。

必要であれば次に、この記事もこれまでと同じ流れでHTML形式に整えて出力できますし、続けて「ひらがなだけ抽出する」「記号だけ除去する」「英数字抽出+半角統一+大文字化の実務テンプレート集」までシリーズ化してまとめることもできます。

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