在C#.net中搜索换行符

7

我该如何在字符串中搜索换行符?以下两种方法似乎都返回-1....!

 theJ = line.IndexOf(Environment.NewLine);

或者

 theJ = line.IndexOf('\n');

它搜索的字符串是“yo\n”,我正在解析的字符串包含“printf(”yo\n“); ”,在比较过程中看到的字符串是这样的:“\tprintf(\”yo \n \“);”。

3
不复制 - 展示您真实的代码。 - BrokenGlass
5
就大多数Windows计算机而言,Environment.NewLine的值为\r\n而不是\n - Yuck
1
@BlueMonster,你遗漏了“line”的声明。如果我们看到你生成它的代码,我们可以确定是否真的没有换行符,因为你转义了转义字符或其他类似情况。 - Servy
1
将代码更改为line.IndexOf("\n");,你会发现它能够执行。发生的情况是,当开发环境显示字符串时,它将\显示为\,所以看起来像是一个换行符。 - David
1
@David:你的意思是 .IndexOf("\\n")。是的,那正是发生的事情。 - StriplingWarrior
显示剩余3条评论
6个回答

8
"yo\n" // output as "yo" + newline
"yo\n".IndexOf('\n') // returns 2
"yo\\n" // output as "yo\n"
"yo\\n".IndexOf('\n') // returns -1

你确定要搜索的是yo\n,而不是yo\\n吗?

编辑

根据你的更新,我可以看出我的猜测是正确的。如果您的字符串如下:

printf("yo\n");

如果没有换行符,则此处不包含换行符。如果有,它将看起来像这样:

printf("yo
");

它实际上包含了一个转义的换行符,换句话说,就是一个反斜杠字符后面跟着一个'n'。这就是为什么当你调试时看到的字符串是"\tprintf(\"yo\\n\");"。如果你想找到这个字符组合,可以使用:
line.IndexOf("\\n")

例如:

"\tprintf(\"yo\\n\");" // output as "  printf("yo\n");"
"\tprintf(\"yo\\n\");".IndexOf("\\n") // returns 11

谢谢,你最后写的那一部分正是我遇到的问题...感谢你的建议。 - BigBug

3

看起来你的行不包含换行符。

如果你在使用File.ReadAllLines或者string.Split函数时按照换行符进行分割,那么返回的数组中每一行都不会包含换行符。如果你在使用StreamReader或者继承自它的类,则ReadLine方法会返回不带有换行符的字符串。

string lotsOfLines = @"one
two
three";

string[] lines = lotsOfLines.Split('\n');

foreach(string line in lines)
{
  Console.WriteLine(line.IndexOf('\n'); // prints -1 three times
}

2
@BlueMonster - 不,它不包含\n。或者,如果包含,那么它不是\n。你怎么知道它包含一个换行符?你从哪里获取这个字符串?你能贴出那段代码吗? - Oded
@BlueMonster - 你看到了一个单独的 \,因为调试器可视化工具会显示 \\。所以你有一个转义的反斜杠后面跟着一个 n,而不是一个换行符。我再问一遍 - 你是怎么得到这个字符串的? - Oded

2

虽然在Windows系统中,您需要搜索“\r\n”,但这应该可以运行。

-1的含义是未找到换行符。


1
当我还在大学时,我做了一个WebForms应用程序来订购参考资料。而换行/回车符则是我用来分隔参考资料的。
        //Text from TextBox
        var text = textBox1.Text;

        //Create an array with the text between the carriage returns
        var references = text.Split(new string[] { "\r\n", "\r" }, StringSplitOptions.RemoveEmptyEntries);

        //Simple OrderBy(Alphabetical)
        var ordered = references.ToList<string>().OrderBy(ff => ff);

        //Return the entry text ordered alphabetical em with a carriage return between every result
        var valueToReturn = String.Join(Environment.NewLine, ordered);
        textBox1.Text = valueToReturn;

1

这取决于你想做什么。在某些平台上,两者可能不完全相同。

Environment.NewLine 返回:

对于非Unix平台,返回一个包含"\r\n"的字符串,对于Unix平台,返回一个包含"\n"的字符串。

另外:

  • 如果你想搜索\n字符(Unix上的换行符),请使用\n
  • 如果你想搜索\r\n字符(Windows上的换行符),请使用\r\n
  • 如果你的搜索依赖于当前平台,请使用Environment.NewLine

如果在你提到的两种情况下都返回-1,则你的字符串中没有换行符。


0

Environment.NewLine与\n不同。它是一个CRLF(\r\n)。然而,我尝试使用IndexOf和\n,我的测试确实找到了这个值。你确定你搜索的是\n而不是\r吗?以十六进制格式查看您的文本,查看十六进制值。


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