具有转义字符的子字符串的奇怪IndexOf()行为

时间:2013-08-27 05:28:37

标签: c# substring indexof

我正在尝试在大字符串中查找字符串“\ 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()调用似乎有什么问题?

5 个答案:

答案 0 :(得分:5)

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

“ABC \ r \ n \ r \ NDEF \ r \尼奇”

 0 : a
 1 : b
 2 : c
 3 : \r
 4 : \n
 5 : \r
 6 : \n
 7 : d
 8 : e
 9 : f
 10: \r
 11: \n
 ...

答案 1 :(得分:2)

应该是3,5和10。

\r\n等计为一个字符,而不是两个。转义字符是代码中的一个字符,而不是两个字符,即使它们是使用字符串中的两个字符编写的。

你算这样:

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

答案 2 :(得分:1)

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

答案 3 :(得分: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/>");

答案 4 :(得分: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)