【C#】指定文字から指定文字まで抽出する

C#

今どきの綺麗なデータの受け渡しならつゆ知らず、レガシーなログやごちゃごちゃなコンフィグの中身をいじったりする際に
文字列抽出は非常に利用頻度が高く、色々な手法があるので纏めてみた。

スポンサーリンク

文字列抽出基本メソッド


様々なパターンの抽出に対応するには複数のメソッドの組み合わせで実現させます。
その中でも特に頻度が高く主軸となるのが下記の4つ

対象文字列.IndexOf(検索したい文字)

対象文字列の中に検索したい文字が何文字目に初めて出現するか数値を返す。見つからない場合は-1を返す。
大体これで先ず位置を求めて他のメソッドで使用するのが文字列抽出の基礎の型。

対象文字列.LastIndexOf(検索したい文字)

IndexOf~の亜種。IndexOf~は初めて出現した位置を返すが、こちらは最後に出現した位置を返す。
見つからない場合は同様に-1を返す。

対象文字列.Substring(抽出を開始したい位置,抽出する文字数)

対象文字列から抽出を開始したい位置と文字数を与え文字列を返す。ただ、抽出する文字数に取得可能以上の数値を入れるとエラーとなるので注意。抽出系のメインとなるメソッド。ちなみに抽出する文字数を省略すると末尾まで抜き出す事が出来ます。

対象文字列.Remove(消去を開始したい位置,消去したい文字数)

対象文字列から指定の文字数を削除した文字列を返す。文字列を綺麗にくり抜く時に余分な所をカットしたい時に使う。

これらを適切に駆使すれば大体の文字列には対応出来る様になるので是非覚えるべし。

指定文字から任意の文字数を取得


ここから本題。
使える場面は限定的だけど最もシンプルで基本のキ的な抽出方法。

string strTarget = "abcdefg";
string strValue = strTarget.Substring(strTarget.IndexOf("abc") + 4, 3);

// 出力結果 > efg

取得したい文字数が固定長であるか、以降全てを抽出したい場合に限るので利用頻度はそこまで高くないかも?
IndexOf(“abc”) +4はIndexOf~で検索したい文字列の長さ+1の値。これをする事でその文字列の次の値から抽出を始める事が出来る。当然+4をしない場合はabcが返るし、cから抽出スタートさせる場合は+3とする。

文字列の後ろから指定文字数まで取得


検索したい単語が複数個所出てくるけどその最後から指定文字数取得したいパターン。

// 対象文字列
string strTarget = "cocacola";
string strValue = strTarget.Substring(strTarget.LastIndexOf("co") + 2, 2);

// 出力結果 > la

IndexOfで同じコードを実行すると出力結果は”ca”となる。使用頻度はそこまででは無いもののたまに使わざるを得ない場合が有る。

指定文字から指定文字まで取得


本記事タイトルでも有り、個人的に最も使用頻度が高いパターン。

string strTarget = "abcdefg";
string strValue = strTarget.Remove(0,strTarget.IndexOf("c"));
strValue = strValue.Remove(strValue.IndexOf("f"));

出力結果 > cde

初めのRemoveで0文字目からcの手前まで削除して”cdefg”にし、その後のRemoveで”f”以降を消して”cde”にする。

改行まで取得する場合や空白まで取得する等も可能なので非常に汎用的。

複数回対象文字列が出る場合は?


Indexof~で前方から検索、LastIndexOfで後方から検索が出来ました。ただそれぞれ最初に引っかかったものから取得をしてしまうので、複数回出現が予測される場合は上手く行かないのです。

もしもその対象文字列の出現が複数回予測されていてn番目から取得したい場合は、
n番目までRemoveを繰り返して整形していく必要が有る。が、そこまで複雑な処理が必要な場合は素直に関数化した方が良いと思われるので、適宜使い分けて行きましょう(ᵔᴥᵔ)

コメント