C#で正規表現を使って文字を検索・置換する

プログラムを作っていると文字を置き換えたい場面があります。

置き換えたい文字がパターンが複数あるようなケースでは、正規表現を使うと楽に置き換えできます。


正規表現とは

正規表現(regular expression)は、文字列の集合を一つの文字列で表現する方法です。

「数値8文字」とか「英字4文字」とか「"Abc"を含む」とか「"A"か"B"で始まる」などのパターンを表現するもので、定義したパターンで検索や置換を行うためのものです。

 

主な正規表現は以下のようなものがあります。

正規表現 概要 使用例 使用例の解説
任意の文字  a.c

「abc」や「aWc」など

* 直前の文字の0個以上繰り返し Abc* 「Ab」や「Abc」や「Abccccc」など
+ 直前の文字の1個以上繰り返し Abc+ 「Abc」や「Abccccc」など
? 直前の文字の0個または1個 Abc? 「Ab」や「Abc」
^ 行の先頭 ^A
^[0-9]
「Abc」や「Aaaa」など(Aで始まる)
「090」や「4BC」など(数値で始まる)
$ 行の最後 3$
[A-C]$
「123」や「Abc3」など(3で終わる)
「09B」や「abC」など(ABCいずれか終わる)
[] カッコ内に書かれた
どれか1文字
a[bB]c
a[a-z]c
a[abx-z]c

「abc」か「aBc」(2文字目がbかB)

「aac」や「agc」や「azc」(2文字目が英小文字)
「abc」や「azc」など(2文字目がa,b,x,y,zのどれか)

[^]

カッコ内に書かれた
1文字を含まない

a[^bB]c
a[^a-z]c
「aac」や「aCc」など(2文字目がbかBはダメ)
「a0c」や「a4c」など(2文字目が英小文字はダメ)
{}

直前のパターンを

カッコ内の回数繰り返し

A{3}
[0-9]{4}

「AAA」(Aが3文字)
「0123」など(数値4桁)

{m,n}

直前のパターンを

m回以上n回以下繰り返し

A{2,3}
[0-9]{3,4}

「AA」や「AAA」(Aが2文字以上3文字以下)
「012」や「1234」など(数値3~4桁)

|

前後の文字どちらか

abc|def

「abc」か「def」

()

カッコ内をグループ化

a(bc|de)f

「abcf」か「adef」


正規表現をあつかうクラス

C#では正規表現をあつかうSystem.Text.RegularExpressions.Regexクラスが用意されています。

正規表現にマッチする箇所を検索する

Regexクラスの MatchメソッドMatchesメソッドを使えば、指定文字列の中から正規表現にマッチする箇所を検索することができます。

マッチした最初の1つを知りたい場合はMatchメソッドを、マッチした全箇所を知りたい場合はMatchesメソッドを使います。結果はSystem.Text.RegularExpressions.Matchクラスで取得でき、発見箇所は発見した文字列などを知ることができます。

        var matchList = Regex.Matches("abc0de1fghijklmn", "[0-9]");
        foreach (Match match in matchList)
        {
            int    index = match.Index; // 発見した文字列の開始位置
            string value = match.Value; // 発見した文字列
        }

正規表現にマッチする文字を置き換える

RegexクラスのReplaceメソッドを使えば、指定文字列の中の正規表現にマッチする箇所を指定の文字に置換することができます。

        var orgText = "abc0de1fghijklmn";
        var newText = Regex.Replace(orgText, "[0-9]", "*");  //数値の部分を*に置き換え