C#でテキスト処理と正規表現

C# コンピュータ
C#
基本的な文字列操作と正規表現について調べてたことを記事にしています。

オブジェクトの文字列化

オブジェクトに.ToString()メソッドが定義されている場合、呼び出すことで文字列化することが出来ます。
Console.WriteLine(obj)などで.ToString()を明示しなくとも呼び出すことが出来るようです。(未確認)
        class MyClass
        {
            public override string ToString()
            {
                return "Foo";
            }
        }
        public static void Main()
        {
            var obj = new MyClass();
            Console.WriteLine(obj);
            // Foo
        }

文字列の結合

変数同士を+で連結

string str1 = "Foo";
string str2 = "Bar";
string result = str1 + str2;
Console.WriteLine(result);
// FooBar

$文字リテラルで{}で変数を埋め込む

string str1 = "Foo";
string str2 = "Bar";
string result = $"{str1}{str2}";
Console.WriteLine(result);
// FooBar

文字列の位置と長さ指定して一部を抽出

文字列.Substring(位置,長さ)位置は一文字目が0に成ります。
string str1 = "FooBar";
string result = str1.Substring(2,3);
Console.WriteLine(result);
// oBa

文字列の置換

\(\\)を/に置き換える例

string path = @"\\PC750Special\Share\dir\file.txt".Replace("\\","/");
Console.WriteLine(path);
// //PC750Special/Share/dir/file.txt

文字列を区切り文字で分割

string csv = "A,B,C";
foreach(var s in csv.Split(","))
{
    Console.WriteLine(s);
}
# A
# B
# C

.Split(区切り文字)で文字配列が返ります。

正規表現

メタ文字

\d  数値
\w  単語構成文字:[a-zA-Z_0-9]
\s  空白
\n  改行
.  任意の一文字
n+  nが1個以上とマッチ
n*  nが0個以上とマッチ
n?  nか0個または1個とマッチ
n+?  nが1個以上最短マッチ
{n}  直前の要素n回とマッチ
$  末尾とマッチ
^  先頭とマッチ
[a-z]+  文字クラス,aからzの1個以上文字とマッチ
[zip|txt]  文字クラス,zip又はtxtとマッチ

正規表現でマッチした文字列を抽出

UNC形式のパスからコンピュータ名と共有名を抜き出す

// \\コンピュータ名\共有フォルダ名 にマッチする正規表現
string pattern = "^//([^/]+?)/([^/]+)";
// 対象文字列(エスケープシーケンスが面倒なのでReplace("\\","/"))
string path = @"\\PC750Special\Share\dir\file.txt".Replace("\\","/");
// マッチング
var match = System.Text.RegularExpressions.Regex.Match(path, pattern);
if (match.Success)
{
    Console.WriteLine($"{match.Groups[0].Value.Replace("/","\\")}");
    // \\PC750Special\Share
    Console.WriteLine($"\\\\{match.Groups[1].Value}\\{match.Groups[2].Value}");
    // \\PC750Special\Share
}

match.Groups[n].Valueでnが0は正規表現でマッチした全体の文字列が取得出来ます。
match.Groups[n].Valueでnが1以降は正規表現内の()にマッチした文字列が取得出来ます。

パスの文字列操作はSystem.IO.PathやSystem.Uriクラスを使うべきですが、対応できない場合の最終手段として正規表現を使います。

コメント