【问题标题】:Weird IndexOf() behavior with substrings having escape characters带有转义字符的子字符串的奇怪 IndexOf() 行为
【发布时间】:2013-08-29 17:45:31
【问题描述】:

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

【问题讨论】:

  • 我认为您的假设是错误的,您能否详细说明您是如何得出 3、7 和 14 的?
  • \r\n 算作 1 而不是 2,因为 '\n' 是一个字符

标签: c# substring indexof


【解决方案1】:

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

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

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

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

string fileContents2 = writer.ToString();

然后这样搜索:

.IndexOf("\\r\\n", start)

【讨论】:

  • 他也需要转义源字符串。
  • 他们正在搜索回车符和换行符,而不是代表它们的转义序列。
【解决方案2】:

\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
 ...

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      应该是 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
      

      【讨论】:

        【解决方案5】:

        以下可能是您问题的更好解决方案

            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/>");
        

        【讨论】:

        • 是的,它看起来确实很活泼。谢谢:)
        猜你喜欢
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多