配列内を正規表現で検索したい
記述するべき内容が不足していたら申し訳ありません。
やりたいこと
配列内を正規表現を用いて検索し、「マッチした文字列」の中で「一番要素数が大きい文字列」を取得したいです。
現状
「文字列」(=inData、可変)と「区切文字」(=delimiter、可変、正規表現を使う場合あり)を投げると、
・Regex.splitを用いて区切る
・「区切前方文字(=front)」を代入
・「マッチした区切文字(delimiter)」を代入
・「区切後方文字(=behind)」を代入
・区切れたら(inData内からdelimiterがマッチする箇所が1つでも存在したら)true/区切れなかったらfalseを返す
上記のことを行う関数(GetSplitData)を作りました。
「区切文字にマッチする箇所が1箇所のみだった」時の動きの例は以下の通りです。
これは想定通り動作しています。
例:GetSplitData("AAA BBB", "\s+", "", "")// inData, delimiter, front, behind
戻り値→inData = "AAA BBB"
front = "AAA"
delimiter = " "
behind = "BBB"
return true
今回「区切り文字にマッチする箇所が複数存在した」時の動きを悩んでいます。
望む形は以下の通りです。
例:GetSplitData("AAA00BBB0000CCC", "[0-9]+", "", "")
→inData = "AAA00BBB0000CCC"
front = "AAA00BBB"
delimiter = "0000"
behind = "CCC"
return true
Regex.splitを用いている為、現在の動きだと
Stringの配列内に"AAA","00","BBB","0000","CCC"が入ります。
ここから後ろの"0000"を取得する方法が思いつきません。
複数存在したら再度配列をdelimiterで舐めようかと思ったのですが、
配列を正規表現を用いて舐める方法が検索しても出てきませんでした。
また、後ろのdelimiterが取得出来た所で、
その前後を取得する方法も思いつきません。
(正規表現なしならLastIndexOfが使えそうだなとは思いましたが…。使うとどうも"[0-9]+"という文字列を検索しに行ってしまう?)
(私が調べ損ねているだけで、LastIndexOfでも正規表現が使えるのでしょうか?)
使えそうなメソッド、アルゴリズム、考え方等ございましたらご教授願います。
皆様のお知恵をお貸しいただければと思います。
どうぞよろしくお願いいたします。
環境
・Microsoft Visual Studio 2013 Express for Windows
・.NET Framework 4.5.1
・C# 5.0
追記
混乱させてしまい申し訳ございません。
delimiterの採用条件は「文字列の長さ」ではなく「一番後ろにあるもの」です。
"AAA0000BBB00CCC"というinData、"[0-9]+"というdelimiterが来た場合、
delimiterに採用するのは「00」です。一番後ろにある為。
array[x]のxのことを「要素数」と勘違いしておりました。
用語を正しく使わなかった為に混乱させてしまい、大変失礼いたしました。
追記2 そもそもこの質問をすることになった経緯
public bool GetSplitData(string inData, string delimiter, ref string front, ref string behind)
{
// 区切文字は後ろから検索する
int index = inData.IndexOf(delimiter);
// 区切り無し
if (index == -1) return false;
front = inData.Substring(0, index);
behind = inData.Substring(index + delimiter.Length, inData.Length - (index + delimiter.Length));
return true;
}
- この関数は「○○課 山田 太郎」のような文字列を区切る為に使用していた
- 最初は上記のコードを使って区切っていた(そもそもindexOfは「最初に見つけた部分のindexを返す関数」のはずなのに何故か最後の部分のindexを返してくれる。未だに謎です。)
- 「1.」の時はデリミターに「課」を入力させ、別の関数で「前にくっつける」ことを行い、「○○課」「山田 太郎」と区切っていた
- 後になって「○○課\r\n山田 太郎」や「○○課○○部 山田太郎」というのが出てきた
- indexOfに"\r\n"や"(課|部)"を入れても区切ってくれない
- 「区切文字がマッチする箇所が複数存在したら一番後ろで区切る」という仕様が決められている
- 質問に至る