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