如何使用C#根据回车符拆分字符串?

67

我有一个名为txbUserName的多行文本框的ASP.NET页面。然后我将3个名称垂直对齐地粘贴到文本框中:

  • Jason
  • Ammy
  • Karen

我想要在检测到回车或换行时,将这些名称拆分为单独的字符串,并以某种方式使用数组。 有什么想法吗?

谢谢。

7个回答

150
string[] result = input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);

这段代码可以同时处理 \n 和 \r\n 类型的换行符,并且删除用户可能输入的空行。

我使用以下代码进行了测试:

        string test = "PersonA\nPersonB\r\nPersonC\n";
        string[] result = test.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
        foreach (string s in result)
            Console.WriteLine(s);

它可以正确地工作,将其拆分为一个包含"PersonA"、"PersonB"和"PersonC"三个字符串的数组。


5
这是否有保证不会先通过 \n 进行拆分,导致 \r\n 被缩减为 \r? - spender
9
@jasonh:“我非常确定”……这往往是名言警句。 :) - Esteban Araya
16
如果您希望确保将输入字符串按照回车符或换行符的所有组合进行拆分,可以使用以下语句:string[] result = input.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - LukeH
如果您希望保留空行,请使用string[] result = input.Split(new char[] { '\r', '\n' }, StringSplitOptions.None); - Kraang Prime
在我的情况下,字符串有时包含 \r,因此我需要将其添加到 Split 参数中 result = input.Split(new char[] { '\r', '\n', '\r\n' }, StringSplitOptions.RemoveEmptyEntries); - Kappacake
显示剩余5条评论

7

将任何 \r\n 替换为 \n,然后使用 \n 进行拆分:

string[] arr = txbUserName.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());

为什么不使用 new char[] { '\n' } - Matthew Scharley
@Matthew:陈旧的习惯难改 :P - o.k.w
3
@Matthew, @o.k.w:甚至可以只使用Split('\n'),因为分隔符数组是一个params参数。 - LukeH

4

请查看String.Split函数(不确定具体语法,我面前没有IDE)。

string[] names = txbUserName.Text.Split(Environment.Newline);

2
Environment.Newline 是服务器环境中的“换行符”表示,它不控制用户可以输入什么,是吗? - o.k.w
1
如果一个常量可以控制用户输入,那我会买更多的微软股票...非常多。 - TryCatch
说实话,最好使用“\r”和/或“\n”,我的回答更侧重于“只需使用.split”来分解字符串。只要高兴就好,你不必在C中编写.split并自己管理内存和指针!年轻的小鬼们真是太容易了。 - TryCatch

1
using System.Text;
using System.Text.RegularExpressions;


 protected void btnAction_Click(object sender, EventArgs e)
    {
        string value = txtDetails.Text;
        char[] delimiter = new char[] { ';','[' };
        string[] parts = value.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
        for (int i = 0; i < parts.Length; i++)
        {
            txtFName.Text = parts[0].ToString();
            txtLName.Text = parts[1].ToString();
            txtAge.Text = parts[2].ToString();
            txtDob.Text = parts[3].ToString();
        }
    }

1

0

这取决于你想做什么。另一个选择是使用 StringReader 类并使用枚举器,这对于小列表可能过于冗长,但对于更大的字符串可能更节省内存:

IEnumerable<string> GetNextString(string input)
{
    using (var sr = new StringReader(input))
    {
        string s;
        while ((s = sr.ReadLine()) != null)
        {
            yield return s;
        }
    }
}

这支持\n\r\n两种行尾。由于它返回一个IEnumerable,您可以使用foreach进行处理,或使用任何标准的linq扩展(ToList()ToArray()Where等)。

例如,使用foreach

var ss = "Hello\nworld\r\ntwo bags\r\nsugar";
foreach (var s in GetNextString(ss))
{
    Console.WriteLine("==> {0}", s);
}

0

试试这个:

message.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

如果成立:

var message = "test 1\r\ntest 2";

或者

var message = "test 1\ntest 2";

或者

var message = "test 1\rtest 2";

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