String」タグアーカイブ

C#で正規表現を使って文字列を置換する方法

正規表現を使った文字列の置換

C#で正規表現を使って文字列を置換したい場合はReplaceメソッドを使って次のような感じにします。

string s = "abc123def456";

Regex re = new Regex(@"[a-z]+");
string result = re.Replace(s, "-");

Debug.Log(result);

実行結果

-123-456

置換する文字列を関数で指定する方法

置換する文字列を細かく制御したい場合は関数を使って置換する文字列を指定することもできます。

string s = "abc123def456";

Regex re = new Regex(@"([a-z]+)");
string result = re.Replace(s, (Match m) => m.Groups[1].Value.ToUpper());

Debug.Log(result);

実行結果

ABC123DEF456

※関数はMatchを引数にとってstringを返すものです。

リンク

Regex.Replace Method (System.Text.RegularExpressions) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.replace?view=net-6.0

MatchEvaluator Delegate (System.Text.RegularExpressions) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.matchevaluator?view=net-6.0

C#で使える書式指定についての簡単なまとめ

C言語のprintf関数で使えるような書式をC#でも使いたいと思って簡単に調べてみました。

int

サンプル

int value = 1234;

// 普通に表示
Console.WriteLine($"{value}");

// 8文字分のスペースに右揃えで表示
Console.WriteLine($"{value,8}");

// 8文字分のスペースに左揃えで表示
Console.WriteLine($"{value,-8}");

// 足りない部分は0で補って8桁で表示
Console.WriteLine($"{value:D8}");

実行結果

1234
    1234
1234    
00001234

サンプル – 16進表記

int value = 1234;

// 16進表記で表示
Console.WriteLine($"{value:X}");

// 8文字分のスペースに右揃えで表示
Console.WriteLine($"{value,8:X}");

// 8文字分のスペースに左揃えで表示
Console.WriteLine($"{value,-8:X}");

// 足りない部分は0で補って8桁の16進表記で表示
Console.WriteLine($"{value:X8}");

実行結果

4D2
     4D2
4D2     
000004D2

サンプル – 16進表記 その2

小文字の16進表記で表示したい場合はXの代わりにxを使います。

int value = 1234;
Console.WriteLine($"{value:x}");
Console.WriteLine($"{value,8:x}");
Console.WriteLine($"{value,-8:x}");
Console.WriteLine($"{value:x8}");

実行結果

4d2
     4d2
4D2     
000004d2

float

サンプル

float value = 123.4f;

// 普通に小数点表示
Console.WriteLine($"{value:F}");

// 8文字分のスペースに右揃えで小数点表示
Console.WriteLine($"{value,8:F}");

// 8文字分のスペースに左揃えで小数点表示
Console.WriteLine($"{value,-8:F}");

// 小数点以下を8桁で表示
Console.WriteLine($"{value:F8}");

実行結果

123.40
  123.40
123.40  
123.40000000

※精度指定子がない場合はNumberFormatInfo.NumberDecimalDigitsの値によって小数点以下の桁数が決まるそうです。

リンク

$ – string interpolation – C# reference | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated

String interpolation in C# | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/string-interpolation

Standard numeric format strings | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings

sedの基本的な使い方

sedはstream editorの略で入力テキストをフィルタリング・テキスト変換するツールです。いろいろ複雑なこともできますが、ここではsedを使った簡単な文字列置換を紹介してみようと思います。

基本的な使い方

基本的な使い方は次のような感じです。

$ echo "input" | sed "s/pattern/replacement/"

"input"で入力した文字列のうちpatternに該当する部分がreplacementに置き換えられて表示されます。

テキストファイルの文字列を置換したい場合は次のような感じで使います。

$ sed "s/pattern/replacement/" input.txt

※結果を保存したい場合は> output.txtでリダイレクトしてください。

簡単な置換のサンプル

簡単な置換の例として、一番先頭にある小文字のtを大文字のTに置き換えてみます。

$ echo "stream editor for filtering and transforming text" | sed 's/t/T/'
sTream editor for filtering and transforming text

tは複数ありますが、何も指定しない場合は一番最初にマッチした部分のみが置き換えられます。今回の場合はstreamのtが該当します。

すべてのtを大文字に置き換えたい場合は"s/pattern/replacement/g"のようにgを追加してください。

$ echo "stream editor for filtering and transforming text" | sed 's/t/T/g'
sTream ediTor for filTering and Transforming TexT

正規表現を使った置換のサンプル

正規表現の詳細は省略しますがsedでも正規表現を使った置換ができます。

簡単な例として、スペース後のワードを-で分割して表示してみたいと思います。

$ echo "stream editor for filtering and transforming text" | sed -r "s/ (.)([^ ]*)/ \1-\2/g"
stream e-ditor f-or f-iltering a-nd t-ransforming t-ext

ポイントとしては\n (nは1から9の数字)を使って()でグループ化したn番目の文字列を参照できるという点です。

ちなみに、マッチした文字列全体を参照したい場合は&が使えます。

$ echo "stream editor for filtering and transforming text" | sed -r "s/ (.)([^ ]*)/ \1-&/g"
stream e- editor f- for f- filtering a- and t- transforming t- text