C#自动化多行字符串修剪

4
我想知道如何在特定字符之后裁剪数组中的每个字符串,例如,我有一个文本框,在其中放置了一个多行字符串,如下所示:

HelloWorld:123

IAmABerliner:JFK

然后我想单击一个按钮,在第二个文本框中所有行中的内容都被裁剪,并只保留":"之前的部分。
第二个文本框中的输出:

HelloWorld

IamABerliner


Win Forms,抱歉之前没有提到。 - European Riven
我是这个论坛的新手...尽我所能 :( - European Riven
你应该使用 string.Split() 并在换行符上进行分割,然后使用它来在每一行上分割 : 字符。 - maccettura
你能把代码发给我吗? - European Riven
我认为这会对你有所帮助。 - Eman Abbas
6个回答

4

WinForms文本框有一个名为Lines的属性。

您可以使用Linq迭代这些行并在:上拆分,然后获取First()索引。

someTextBox.Lines = someTextBox.Lines.Select(x => x.Split(':').First()).ToArray();

1
你不能在 foreach 方法中使用 s =。 - European Riven
@EuropeanRiven 在通话中没有注意,检查更新。 - maccettura
1
最容易实现和理解的解决方案 - Mike

1

这只是一种替代方法,我更喜欢其他的方法,但你也可以使用正则表达式:

txtInput.Text = System.Text.RegularExpressions.Regex.Replace(txtInput.Text, "(?m):.*$", string.Empty);
  • (?m) 打开多行模式
  • : 匹配冒号字面量
  • .* 匹配除换行符外的任何字符的零个或多个 (*)
  • $ 由于启用了多行模式,因此匹配行尾(但不包括换行符)

这是最高效的解决方案,但对于没有太多正则表达式使用或理解经验的大多数人来说很难理解。 - Mike

0

这可能不是最优雅的解决方案,但这就是我想出来的。

string input = TextBox1.Text;
string[] input_split = input.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
string output = "";
for(int i = 0; i < input_split.Length; i++)
{
    string[] split_again = input_split[i].Split(':');
    output += split_again[0];
}
TextBox2.Text = output;

我测试了它,并且得到了期望的输出。

你只需要使用我提供的字符串作为示例进行翻译。但是我想从Windows窗体文本框中获取多行字符串。 - European Riven
是的,我用它们作为示例,但下面的代码将适用于该格式中的任何多行输入。 - Caleb Johnson
我进行了编辑,使其更加通用。您应该能够将其复制/粘贴到您的代码中并更改文本框名称,它就可以工作了。 - Caleb Johnson
Lambda > LINQ! - Mike

0
你可以使用这个小片段来获取你想要的字符串:
string trimmedInput = string.Join(
    "\n", 
    input
       .Split('\n')
       .Select(s => s.Substring(0, s.IndexOf(":"))));

首先获取所有行的数组,然后在分号后对其进行修剪,最后将它们放回到一个字符串中而不是行的数组。


0

以下使用 StringBuilder 和 split 的简单代码适用于我。

StringBuilder sb = new StringBuilder();
var st = textBox1.Text.Split('\n');
for (int i = 0; i < st.Length; i++)
{
   sb.AppendLine(st[i].Split(':')[0]);
}
textBox2.Text = sb.ToString();

-2
使用 string.Split 方法,只取第一部分:
string result = textBox2.Text.Split(':')[0];

对于多行字符串:

string result = string.Empty;

foreach (string line in textBox2.Text.Split(Environment.NewLine.ToCharArray()))
{
    result += line.Split(':')[0] + Environment.NewLine;
}

这并不考虑行/换行符。 - maccettura
工作吗?抱歉,我有点傻;D - European Riven
@Mike 感谢您的反馈。欢迎您提出不同意见。我更喜欢这种简单的方式,而不是使用不必要的 RegexLinqfor 循环... - Guilherme
lambda表达式是简化的foreach循环,但我认为对于初学者来说这样回答也可以,我们不想太早混淆新开发人员的思维! - Mike
@Mike,Lambda表达式并不是简化的“foreach”循环。它们需要理解匿名函数、延迟执行和作用域捕获。它们只是更加简洁... - Guilherme
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接