0

我试图在一个大字符串中找到字符串“\r\n”(基本上是换行和返回)的所有索引。

我需要这样做,因为我必须将大字符串逐行写入 PDF 文件(我必须在编写前一行之后调用我正在使用的 dll 的换行 API)。

这是代码的简短版本:-

    string fileContents = "abc\r\n\r\ndef\r\nghi";

    int pos = -1; 

    int start = 0;

    while ((pos = fileContents.IndexOf("\r\n", start)) != -1)
    {
        //extract string
        //write string to PDF
        //call newline API

        start = pos + 1;

    }

fileContents 变量中“\r\n”的预期位置是 3,7 和 14。但是,在调试代码时,pos 变量中的值是 3、5 和 10。

我的 indexOf() 调用似乎有什么问题?

4

5 回答 5

5

\n或任何其他特殊字符都是特殊字符.... 这意味着即使您用 2 个字符编写它们,实际上也只是 1 个字符:

"abc\r\n\r\ndef\r\nghi"

 0 : a
 1 : b
 2 : c
 3 : \r
 4 : \n
 5 : \r
 6 : \n
 7 : d
 8 : e
 9 : f
 10: \r
 11: \n
 ...
于 2013-08-27T05:32:40.223 回答
2

它应该是 3、5 和 10。

\rand \netc. 算作一个字符,而不是两个。转义字符是代码中的一个字符,而不是两个字符,即使它们是使用字符串中的两个字符编写的。

你这样算:

a_b_c_\r_\n_\r_\n_d_e_f_\r_\n_g__h__i
0_1_2_3__4__5__6__7_8_9_10_11_12_13_14
于 2013-08-27T05:34:31.027 回答
1

\n 或 \r 字符都将显示为单个字符 - 而不是两个。这意味着您看到的位置是正确的。只需将每个 \x 字符计为一个字符即可

于 2013-08-27T05:34:03.617 回答
1

以下可以更好地解决您的问题

    string s = "abc\r\n\r\ndef\r\nghi";
    List<String> lines = s.Split("\r\n".ToCharArray()).ToList();

    lines.RemoveAll(str => str == "");

    foreach (string l in lines)
        Response.Write(l + "<br/>");
于 2013-08-27T06:52:04.570 回答
0

尝试以您最初想要的方式搜索文字,作为其余答案的替代方案。

首先转换您的字符串以转义所有文字:

var writer = new StringWriter();
var provider = CodeDomProvider.CreateProvider("CSharp"));

provider.GenerateCodeFromExpression(new CodePrimitiveExpression(fileContents), writer, null);

string fileContents2 = writer.ToString();

然后这样搜索:

.IndexOf("\\r\\n", start)
于 2013-08-27T05:31:41.173 回答