テキストファイル、キャリッジリターン、タブなどを含む文字列があるとします。その文字列の最初の空白行(空白のみを含む行を含める)のインデックスを見つけるにはどうすればよいですか?
私が試したこと:
この場合、私は空白行のインデックスを見つけるために醜いコードの束を活用する作業関数を持っています。これよりもエレガントで読みやすい方法が必要です。
明確にするために、以下の関数は、指定された「タイトル」の文字列から、タイトルの後の最初の空白行のインデックスまでのセクションを返します。そのほとんどがそのインデックスの検索によって消費されるため、完全に提供されます。また、「なぜ世界で空白行のインデックスが必要なのか」という質問を避けるために。また、XY問題がここで発生している場合は、それを打ち消すために。
(明らかに機能している、すべてのエッジケースをテストしていない)コード:
// Get subsection indicated by supplied title from supplied section
private static string GetSubSectionText(string section, string subSectionTitle)
{
int indexSubSectionBgn = section.IndexOf(subSectionTitle);
if (indexSubSectionBgn == -1)
return String.Empty;
int indexSubSectionEnd = section.Length;
// Find first blank line after found sub-section
bool blankLineFound = false;
int lineStartIndex = 0;
int lineEndIndex = 0;
do
{
string temp;
lineEndIndex = section.IndexOf(Environment.NewLine, lineStartIndex);
if (lineEndIndex == -1)
temp = section.Substring(lineStartIndex);
else
temp = section.Substring(lineStartIndex, (lineEndIndex - lineStartIndex));
temp = temp.Trim();
if (temp.Length == 0)
{
if (lineEndIndex == -1)
indexSubSectionEnd = section.Length;
else
indexSubSectionEnd = lineEndIndex;
blankLineFound = true;
}
else
{
lineStartIndex = lineEndIndex + 1;
}
} while (!blankLineFound && (lineEndIndex != -1));
if (blankLineFound)
return section.Substring(indexSubSectionBgn, indexSubSectionEnd);
else
return null;
}
フォローアップ編集:
結果(Konstantinの回答に大きく基づいています):
// Get subsection indicated by supplied title from supplied section
private static string GetSubSectionText(string section, string subSectionTitle)
{
string[] lines = section.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
int subsectStart = 0;
int subsectEnd = lines.Length;
// Find subsection start
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Trim() == subSectionTitle)
{
subsectStart = i;
break;
}
}
// Find subsection end (ie, first blank line)
for (int i = subsectStart; i < lines.Length; i++)
{
if (lines[i].Trim().Length == 0)
{
subsectEnd = i;
break;
}
}
return string.Join(Environment.NewLine, lines, subsectStart, subsectEnd - subsectStart);
}
結果とKonstantinの回答の主な違いは、フレームワークのバージョン(.NET 2.0を使用しており、string []。Takeをサポートしていません)と、ハードコードされた'\n'の代わりにEnvironment.NewLineを利用していることによるものです。 。元のパスよりもはるかに美しく、読みやすくなっています。皆さんありがとう!