C#で知っておくべき文字列操作テクニック10選

C#の文字列操作は、効率的なコードを書くための基本です。プログラマーにとって、文字列操作は頻繁に必要となるタスクであり、その方法を効率的に使いこなすことは非常に重要です。この記事では、C#でよく使われる文字列操作のテクニックを紹介し、それぞれの使い方や利点を解説します。これらのテクニックを身につけることで、コードの読みやすさやパフォーマンスを向上させることができるでしょう。

目次

文字列の連結方法

C#での文字列の連結にはいくつかの方法があります。それぞれの方法には利点と欠点があり、状況に応じて最適な方法を選択することが重要です。

String.Concatメソッド

String.Concatメソッドは、複数の文字列を連結する基本的な方法です。

string str1 = "Hello, ";
string str2 = "World!";
string result = String.Concat(str1, str2);
Console.WriteLine(result);  // Output: Hello, World!

+演算子

+演算子は、簡単に使える文字列連結方法です。小規模な文字列連結に適しています。

string str1 = "Hello, ";
string str2 = "World!";
string result = str1 + str2;
Console.WriteLine(result);  // Output: Hello, World!

StringBuilderクラス

大量の文字列を連結する場合は、StringBuilderクラスを使用することが推奨されます。パフォーマンスが向上します。

using System.Text;

StringBuilder sb = new StringBuilder();
sb.Append("Hello, ");
sb.Append("World!");
string result = sb.ToString();
Console.WriteLine(result);  // Output: Hello, World!

String.Formatメソッド

String.Formatメソッドは、フォーマットされた文字列を作成する際に便利です。

string str1 = "Hello";
string str2 = "World";
string result = String.Format("{0}, {1}!", str1, str2);
Console.WriteLine(result);  // Output: Hello, World!

Interpolated Strings(文字列補間)

C# 6.0以降では、文字列補間を使用して簡潔に文字列を連結できます。

string str1 = "Hello";
string str2 = "World";
string result = $"{str1}, {str2}!";
Console.WriteLine(result);  // Output: Hello, World!

これらの方法を状況に応じて使い分けることで、効率的な文字列連結が可能になります。

文字列の分割方法

C#では、文字列を特定の区切り文字で分割するために、さまざまな方法が提供されています。これにより、文字列を部分に分解して操作することが容易になります。

String.Splitメソッド

String.Splitメソッドは、文字列を指定された区切り文字で分割し、文字列の配列を返します。

string str = "apple,banana,cherry";
string[] fruits = str.Split(',');
foreach (string fruit in fruits)
{
    Console.WriteLine(fruit);
}
// Output:
// apple
// banana
// cherry

複数の区切り文字で分割

String.Splitメソッドは、複数の区切り文字を指定することも可能です。

string str = "apple;banana,cherry";
char[] delimiters = { ',', ';' };
string[] fruits = str.Split(delimiters);
foreach (string fruit in fruits)
{
    Console.WriteLine(fruit);
}
// Output:
// apple
// banana
// cherry

StringTokenizerクラス(古い方法)

.NETでは標準的に提供されていませんが、StringTokenizerクラスを使って文字列をトークンに分割する方法もあります。

using System;
using System.Collections.Generic;

public class StringTokenizer
{
    private readonly string _str;
    private readonly string[] _delimiters;

    public StringTokenizer(string str, params string[] delimiters)
    {
        _str = str;
        _delimiters = delimiters;
    }

    public IEnumerable<string> Tokenize()
    {
        return _str.Split(_delimiters, StringSplitOptions.None);
    }
}

string str = "apple;banana,cherry";
var tokenizer = new StringTokenizer(str, ",", ";");
foreach (string token in tokenizer.Tokenize())
{
    Console.WriteLine(token);
}
// Output:
// apple
// banana
// cherry

Regex.Splitメソッド

正規表現を使用して文字列を分割することも可能です。より柔軟な分割が必要な場合に便利です。

using System.Text.RegularExpressions;

string str = "apple;banana,cherry";
string[] fruits = Regex.Split(str, "[,;]");
foreach (string fruit in fruits)
{
    Console.WriteLine(fruit);
}
// Output:
// apple
// banana
// cherry

これらの方法を使うことで、文字列を効率的に分割し、必要な部分を取り出して操作することができます。

文字列の部分抽出

C#では、文字列の一部を抽出するためのさまざまな方法が用意されています。これにより、特定の部分を取り出して操作することが可能です。

Substringメソッド

Substringメソッドは、指定した位置から指定した長さまでの部分文字列を抽出します。

string str = "Hello, World!";
string result = str.Substring(7, 5);
Console.WriteLine(result);  // Output: World

IndexOfとSubstringの組み合わせ

IndexOfメソッドと組み合わせて、特定の文字列の位置を基に部分文字列を抽出することができます。

string str = "The quick brown fox";
int startIndex = str.IndexOf("quick");
string result = str.Substring(startIndex, 5);
Console.WriteLine(result);  // Output: quick

Splitメソッドとの組み合わせ

Splitメソッドを使用して文字列を分割し、その一部を取り出すことも可能です。

string str = "apple,banana,cherry";
string[] fruits = str.Split(',');
string result = fruits[1];  // Extract the second fruit
Console.WriteLine(result);  // Output: banana

正規表現による部分抽出

正規表現を使って、パターンにマッチする部分を抽出する方法です。

using System.Text.RegularExpressions;

string str = "Name: John, Age: 30";
Regex regex = new Regex(@"Name: (\w+), Age: (\d+)");
Match match = regex.Match(str);

if (match.Success)
{
    string name = match.Groups[1].Value;
    string age = match.Groups[2].Value;
    Console.WriteLine($"Name: {name}, Age: {age}");  // Output: Name: John, Age: 30
}

範囲演算子を使った部分抽出

C# 8.0以降では、範囲演算子を使用して部分文字列を簡単に抽出できます。

string str = "Hello, World!";
string result = str[7..12];
Console.WriteLine(result);  // Output: World

これらの方法を活用することで、必要な部分を効率的に抽出し、さまざまな操作を行うことができます。

文字列の置換

C#では、文字列の一部を他の文字列に置き換えるためのさまざまな方法が提供されています。これにより、特定のパターンや文字列を効率的に修正できます。

String.Replaceメソッド

String.Replaceメソッドは、指定した文字列を別の文字列に置き換えます。

string str = "Hello, World!";
string result = str.Replace("World", "C#");
Console.WriteLine(result);  // Output: Hello, C#!

正規表現による置換

Regex.Replaceメソッドを使用すると、正規表現パターンにマッチする部分を置き換えることができます。

using System.Text.RegularExpressions;

string str = "The rain in Spain stays mainly in the plain.";
string pattern = @"\bain\b";
string replacement = "ane";
string result = Regex.Replace(str, pattern, replacement);
Console.WriteLine(result);  // Output: The rane in Spane stays mainly in the plane.

条件付きの置換

条件に基づいて置換を行う場合は、カスタムロジックを組み込むことができます。

string str = "Apples are red, bananas are yellow.";
string[] words = str.Split(' ');
for (int i = 0; i < words.Length; i++)
{
    if (words[i] == "red")
    {
        words[i] = "green";
    }
}
string result = string.Join(' ', words);
Console.WriteLine(result);  // Output: Apples are green, bananas are yellow.

複数の置換

複数の置換を一度に行う場合は、String.Replaceメソッドを連続して使用するか、Dictionaryを使用して一括置換する方法があります。

string str = "I love apples and bananas.";
var replacements = new Dictionary<string, string>
{
    { "apples", "oranges" },
    { "bananas", "grapes" }
};

foreach (var pair in replacements)
{
    str = str.Replace(pair.Key, pair.Value);
}
Console.WriteLine(str);  // Output: I love oranges and grapes.

部分一致の置換

文字列の部分一致に基づいて置換を行う方法もあります。

string str = "cat, caterpillar, category";
string result = Regex.Replace(str, "cat", "dog");
Console.WriteLine(result);  // Output: dog, dogerpillar, dogegory

これらの方法を使い分けることで、さまざまなシナリオに対応した文字列の置換が可能になります。

文字列のフォーマット

C#では、文字列のフォーマット方法としていくつかの強力な機能が提供されています。これにより、異なるデータ型をフォーマットされた文字列に変換することができます。

String.Formatメソッド

String.Formatメソッドは、フォーマット指定子を使って文字列を整形します。

int age = 30;
string name = "John";
string formattedString = String.Format("Name: {0}, Age: {1}", name, age);
Console.WriteLine(formattedString);  // Output: Name: John, Age: 30

文字列補間(Interpolated Strings)

C# 6.0以降では、文字列補間を使用して簡潔にフォーマットされた文字列を作成できます。

int age = 30;
string name = "John";
string formattedString = $"Name: {name}, Age: {age}";
Console.WriteLine(formattedString);  // Output: Name: John, Age: 30

ToStringメソッドとフォーマット指定子

数値や日時などのデータ型は、ToStringメソッドを使ってフォーマットできます。

double number = 1234.5678;
string formattedNumber = number.ToString("N2");
Console.WriteLine(formattedNumber);  // Output: 1,234.57

DateTime date = DateTime.Now;
string formattedDate = date.ToString("yyyy-MM-dd");
Console.WriteLine(formattedDate);  // Output: 2024-07-03

StringBuilderを使ったフォーマット

StringBuilderは、複数の文字列を効率的に連結およびフォーマットする際に便利です。

using System.Text;

StringBuilder sb = new StringBuilder();
sb.AppendFormat("Name: {0}, Age: {1}", name, age);
string formattedString = sb.ToString();
Console.WriteLine(formattedString);  // Output: Name: John, Age: 30

複雑なフォーマット

複雑なフォーマットを行う場合、複数のフォーマット指定子やカスタムロジックを使用できます。

int hours = 4;
int minutes = 30;
string time = String.Format("{0:D2}:{1:D2}", hours, minutes);
Console.WriteLine(time);  // Output: 04:30

これらの方法を活用することで、さまざまな形式でデータを表示するためのフォーマットされた文字列を作成することができます。

文字列の検索

C#では、文字列内で特定の文字列を検索するためのさまざまな方法が提供されています。これにより、文字列の特定の部分を効率的に見つけ出し、操作することができます。

IndexOfメソッド

IndexOfメソッドは、特定の文字または文字列が最初に出現する位置を返します。見つからない場合は-1を返します。

string str = "The quick brown fox";
int index = str.IndexOf("quick");
Console.WriteLine(index);  // Output: 4

LastIndexOfメソッド

LastIndexOfメソッドは、特定の文字または文字列が最後に出現する位置を返します。

string str = "The quick brown fox jumps over the lazy dog";
int index = str.LastIndexOf("the");
Console.WriteLine(index);  // Output: 31

Containsメソッド

Containsメソッドは、特定の文字列が含まれているかどうかを確認します。真または偽を返します。

string str = "Hello, World!";
bool contains = str.Contains("World");
Console.WriteLine(contains);  // Output: True

StartsWithメソッドとEndsWithメソッド

StartsWithメソッドとEndsWithメソッドは、それぞれ文字列が特定の文字列で始まるか、または終わるかを確認します。

string str = "Hello, World!";
bool startsWith = str.StartsWith("Hello");
bool endsWith = str.EndsWith("World!");
Console.WriteLine(startsWith);  // Output: True
Console.WriteLine(endsWith);    // Output: True

正規表現による検索

Regexクラスを使用すると、より複雑なパターンマッチングが可能です。

using System.Text.RegularExpressions;

string str = "The rain in Spain stays mainly in the plain.";
Regex regex = new Regex(@"\bin\b");
Match match = regex.Match(str);

if (match.Success)
{
    Console.WriteLine($"Found '{match.Value}' at position {match.Index}");
}
// Output: Found 'in' at position 8

String.IndexOfAnyメソッド

IndexOfAnyメソッドは、指定された複数の文字のいずれかが最初に出現する位置を返します。

string str = "Hello, World!";
char[] anyOf = { 'W', 'o' };
int index = str.IndexOfAny(anyOf);
Console.WriteLine(index);  // Output: 4

これらの検索方法を利用することで、文字列内の特定の部分を効率的に見つけ出し、操作することができます。

文字列の大文字・小文字変換

C#では、文字列の大文字と小文字を変換するための簡単な方法が提供されています。これにより、文字列の正規化や一貫性のあるフォーマットが容易になります。

ToUpperメソッド

ToUpperメソッドは、文字列内のすべての文字を大文字に変換します。

string str = "Hello, World!";
string upperStr = str.ToUpper();
Console.WriteLine(upperStr);  // Output: HELLO, WORLD!

ToLowerメソッド

ToLowerメソッドは、文字列内のすべての文字を小文字に変換します。

string str = "Hello, World!";
string lowerStr = str.ToLower();
Console.WriteLine(lowerStr);  // Output: hello, world!

CultureInfoを使用した変換

特定の文化圏に対応した大文字・小文字変換を行うには、CultureInfoを指定します。これは特定の言語や文化に応じた変換を行う場合に有効です。

using System.Globalization;

string str = "Hello, World!";
CultureInfo cultureInfo = new CultureInfo("tr-TR");  // トルコ語の文化情報
string upperStr = str.ToUpper(cultureInfo);
Console.WriteLine(upperStr);  // Output: HELLO, WORLD!(トルコ語の例)

TextInfoを使用した変換

TextInfoクラスを使って、タイトルケース(単語の最初の文字だけを大文字にする)の変換を行うことも可能です。

using System.Globalization;

string str = "hello, world!";
TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;
string titleCaseStr = textInfo.ToTitleCase(str);
Console.WriteLine(titleCaseStr);  // Output: Hello, World!

InvariantCultureを使用した変換

文化圏に依存しない変換を行う場合は、CultureInfo.InvariantCultureを使用します。

string str = "Hello, World!";
string upperStr = str.ToUpper(CultureInfo.InvariantCulture);
Console.WriteLine(upperStr);  // Output: HELLO, WORLD!

これらの方法を使うことで、文字列の大文字・小文字変換を効率的に行い、データの一貫性を保つことができます。

文字列のトリミング

C#では、文字列の先頭や末尾の不要な空白や特定の文字を削除するためのトリミング機能が提供されています。これにより、入力データの整形や不要な空白の除去が容易になります。

Trimメソッド

Trimメソッドは、文字列の先頭と末尾のすべての空白文字を削除します。

string str = "   Hello, World!   ";
string trimmedStr = str.Trim();
Console.WriteLine($"'{trimmedStr}'");  // Output: 'Hello, World!'

TrimStartメソッド

TrimStartメソッドは、文字列の先頭の空白文字を削除します。

string str = "   Hello, World!   ";
string trimmedStartStr = str.TrimStart();
Console.WriteLine($"'{trimmedStartStr}'");  // Output: 'Hello, World!   '

TrimEndメソッド

TrimEndメソッドは、文字列の末尾の空白文字を削除します。

string str = "   Hello, World!   ";
string trimmedEndStr = str.TrimEnd();
Console.WriteLine($"'{trimmedEndStr}'");  // Output: '   Hello, World!'

特定の文字をトリミング

Trimメソッドにパラメータとして特定の文字を渡すことで、その文字をトリミングすることができます。

string str = "***Hello, World!***";
char[] trimChars = { '*' };
string trimmedStr = str.Trim(trimChars);
Console.WriteLine($"'{trimmedStr}'");  // Output: 'Hello, World!'

TrimStartとTrimEndの特定の文字を指定したトリミング

TrimStartメソッドとTrimEndメソッドにも特定の文字を渡してトリミングを行うことができます。

string str = "***Hello, World!***";
char[] trimChars = { '*' };
string trimmedStartStr = str.TrimStart(trimChars);
string trimmedEndStr = str.TrimEnd(trimChars);
Console.WriteLine($"'{trimmedStartStr}'");  // Output: 'Hello, World!***'
Console.WriteLine($"'{trimmedEndStr}'");    // Output: '***Hello, World!'

これらのトリミング方法を使うことで、文字列の先頭や末尾の不要な空白や特定の文字を効率的に削除し、データを整形することができます。

コメント

コメントする

目次