C# 如何拆分行,但保留带制表符的行?
我知道如何用新线分开一根长绳子C# 如何拆分行,但保留带制表符的行?,c#,split,string-split,C#,Split,String Split,我知道如何用新线分开一根长绳子 string[] lines = d.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 但是我想 Split in new lines like this and in new lines + tabs like this, in order to have an array which contains the firs
string[] lines = d.Split(new string[] { Environment.NewLine },
StringSplitOptions.RemoveEmptyEntries);
但是我想
Split in new lines like this
and in new lines + tabs
like this, in order to have
an array which contains the first line and this second block.
基本上,我不想按一条规则分割,而是按两条规则分割。
结果数组应包含以下字符串:
[0] Split in new lines like this
[1] and in new lines + tabs
like this, in order to have
an array which contains the first line and this second block.
拆分所有行后,可以像这样“连接”选项卡行:
List<string> lines = d.Split(new string[] { Environment.NewLine })
.ToList();
// loop through all lines, but skip the first (lets assume it isn't tabbed)
for (int i = 1; i < lines.Count; i++)
{
if (lines[i][0] == '\t') // current line starts with tab
{
lines[i - 1] += "\r\n" + lines[i]; // append it to prev line
lines.RemoveAt(i); // remove current line from list
i--; // and dec i so you don't skip an item
}
}
List lines=d.Split(新字符串[]{Environment.NewLine})
.ToList();
//循环所有行,但跳过第一行(假设它不是选项卡式的)
对于(int i=1;i
您可以添加更复杂的逻辑来考虑不同数量的选项卡(如果您想要的话),但这应该让您开始。
如果希望将多个选项卡行组合在一起,您可能希望使用
StringBuilder
而不是string
,以提高将这些行追加到一起的性能。拆分所有行后,您可以像这样“连接”选项卡行:
List<string> lines = d.Split(new string[] { Environment.NewLine })
.ToList();
// loop through all lines, but skip the first (lets assume it isn't tabbed)
for (int i = 1; i < lines.Count; i++)
{
if (lines[i][0] == '\t') // current line starts with tab
{
lines[i - 1] += "\r\n" + lines[i]; // append it to prev line
lines.RemoveAt(i); // remove current line from list
i--; // and dec i so you don't skip an item
}
}
List lines=d.Split(新字符串[]{Environment.NewLine})
.ToList();
//循环所有行,但跳过第一行(假设它不是选项卡式的)
对于(int i=1;i
您可以添加更复杂的逻辑来考虑不同数量的选项卡(如果您想要的话),但这应该让您开始。
如果希望将多个选项卡式行组合在一起,则可能需要使用
StringBuilder
而不是string
,以提高将行追加到一起的性能。这一技巧应该有效。我已将“\n\t”临时替换为“\r”。拆分字符串后,还原回“\n\t”字符串。因此,您的数组行将具有所需的字符串计数
这样,您可以获得所需的输出:
d = d.Replace("\n\t", "\r");
string[] lines = d.Split(new string[] {"\n"}, StringSplitOptions.RemoveEmptyEntries);
lines = lines.Select((line) => line = line.Replace("\r", "\n\t")).ToArray();
这个把戏应该管用。我已将“\n\t”临时替换为“\r”。拆分字符串后,还原回“\n\t”字符串。因此,您的数组行将具有所需的字符串计数 这样,您可以获得所需的输出:
d = d.Replace("\n\t", "\r");
string[] lines = d.Split(new string[] {"\n"}, StringSplitOptions.RemoveEmptyEntries);
lines = lines.Select((line) => line = line.Replace("\r", "\n\t")).ToArray();
什么是账单?
如果为4个空格,请使用以下模式:
string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
如果是表格,请使用以下模式:
string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
接下来,我们使用正则表达式:
string[] lines = Regex.Split(text, pattern);
什么是账单?
如果为4个空格,请使用以下模式:
string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
如果是表格,请使用以下模式:
string pattern = Environment.NewLine + @"(?!\s{4})";
string pattern = Environment.NewLine + @"(?!\t)";
接下来,我们使用正则表达式:
string[] lines = Regex.Split(text, pattern);
一个人应该在正确的情况下使用正确的工具。避免使用任何人都可以使用的工具(顺便说一句,每个编程语言中都有这种工具)是愚蠢的 当一个可识别的模式必须用字符串函数来表示,而字符串函数不能或很容易做到时,正则表达式是最好的。下面我使用的每一个工具的情况下,它是最好的设计
下面是使用regex、string op和Linq的三阶段操作
|
)替换\r\n\t
,以标识它们的专业。这是通过regex完成的,因为我们能够以最小的开销有效地分组和处理操作选择
来投影(更改)每一行,以将
更改为\r\n
在LinqPad中运行带有前后结果的完整代码。请注意,
.Dump()
仅在Linqpad中用于显示结果,而不是Linq扩展
结果一:
完整代码
string text = string.Format("{1}{0}{2}{0}\t\t{3}{0}\t\t{4}",
Environment.NewLine,
"Split in new lines like this",
"and in new lines + tabs",
"like this, in order to have",
"an array which contains the first line and this second block.");
text.Dump("Before");
var result = Regex.Replace(text, "\r\n\t", "|\t")
.Split(new string[] { Environment.NewLine }, StringSplitOptions.None )
.Select (rLine => rLine.Replace("|", Environment.NewLine));
result.Dump("after");
一个人应该在正确的情况下使用正确的工具。避免使用任何人都可以使用的工具(顺便说一句,每个编程语言中都有这种工具)是愚蠢的 当一个可识别的模式必须用字符串函数来表示,而字符串函数不能或很容易做到时,正则表达式是最好的。下面我使用的每一个工具的情况下,它是最好的设计
下面是使用regex、string op和Linq的三阶段操作
|
)替换\r\n\t
,以标识它们的专业。这是通过regex完成的,因为我们能够以最小的开销有效地分组和处理操作选择
来投影(更改)每一行,以将
更改为\r\n
在LinqPad中运行带有前后结果的完整代码。请注意,
.Dump()
仅在Linqpad中用于显示结果,而不是Linq扩展
结果一:
完整代码
string text = string.Format("{1}{0}{2}{0}\t\t{3}{0}\t\t{4}",
Environment.NewLine,
"Split in new lines like this",
"and in new lines + tabs",
"like this, in order to have",
"an array which contains the first line and this second block.");
text.Dump("Before");
var result = Regex.Replace(text, "\r\n\t", "|\t")
.Split(new string[] { Environment.NewLine }, StringSplitOptions.None )
.Select (rLine => rLine.Replace("|", Environment.NewLine));
result.Dump("after");
你想要什么还不清楚。定义特定规则(然后您可能会回答自己的问题)发布大量数据样本。我已经解析文本文件40多年了,可以提供帮助,但需要更大的输入样本。@jdweng-您不需要样本,您需要规则sso
a\r\nb\r\n\tc1\r\n\tc2\r\nd
变成{a”,“b”,“\tc1\r\n\tc2”,“d”