假设我有一个包含文本文件、回车和制表符的字符串。如何在该字符串中找到第一个空白行(包括仅包含空白的行)的索引?
我试过的:
在这种情况下,我有一个工作函数,它利用一堆丑陋的代码来查找空行的索引。必须有比this更优雅/更易读的方法。
为了清楚起见,下面的函数将字符串中的部分从提供的“标题”返回到标题后第一个空行的索引。完整提供,因为大部分内容都用于搜索该索引,并避免任何“为什么在世界上你需要空行索引”的问题。如果它发生在这里,也可以抵消 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;
}
后续编辑:
结果(很大程度上基于康斯坦丁的回答):
// 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),并利用 Environment.NewLine 而不是硬编码的 '\n' . 比原来的通行证更漂亮、更易读。谢谢大家!