2009-06-25 40 views
2

一个字符串变量str包含在它里面的某处以下:se\">.NET字符串的IndexOf意想不到的结果

我试图用找到它的开始:

str.IndexOf("se\\\">") 

返回-1

为什么不找到子字符串?

注意:由于编辑该片段显示5x \一段时间,原来有3连续。

+0

你在做什么看起来不错,你可以发布实际的代码吗?也许这只是一个小细节... – 2009-06-25 11:41:42

+1

我认为你可能有一个额外的反斜杠 - 你确定它实际上不是“se”> `你想找? – Groo 2009-06-25 11:42:17

+0

看着原始问题和Kev版本,似乎还有很多\在索引中,是一个错误? – Fredou 2009-06-25 11:54:51

回答

8

您的代码实际上是在搜索'se\\">'。当字符串包括反斜杠搜索我经常发现它更容易使用逐字字符串:

str.IndexOf(@"se\"">") 

在这种情况下,你还可以在搜索字符串报价,因此仍有一些逃逸,但我个人觉得它更容易读。

更新:我的回答是基于在IndexOf调用中引入了额外斜线的编辑。根据目前的版本,我会把我的赌注放在str上,而不包含预期的字符序列。

更新2: 基于对这个答案的评论,这似乎是关于字符串中的“\”字符的角色有些混乱。当您在Visual Studio调试器中检查字符串时,它将显示转义字符。因此,如果您有一个文本框并在其中键入'c:\',则在调试器中检查Text属性将显示'c:\\'。为了逃避目的,添加了一个额外的反斜杠。实际的字符串内容仍然是'c:\'(可以通过检查字符串的Length属性进行验证;它将是3而不是4)。

如果我们采取以下字符串(从下面的评论所)

"“< EM 类= \ " correct_response \ " >一个 夜灯</EM > < BR /> < br/> <表 width = \ " 100%\ " > <TR> < TD 类= \ "右\ " >英格丽</TD > </TR > < /表>“)"

...的\"序列简单地逃脱引号;反斜杠不是字符串内容的一部分。所以,你实际上是在寻找'se">',而不是'se\">'。这些都可以工作:

str.IndexOf(@"se"">"); // verbatim string; escape quotation mark by doubling it 
str.IndexOf("se\">"); // regular string; escape quotation mark using backslash 
2

这工作:

string str = "<case\\\">"; 
int i = str.IndexOf("se\\\">"); // i = 3 

也许你没有正确地逃避两个字符串中的一个?

编辑您正在搜索的字符串中还有一对\

1

以下代码:

public static void RunSnippet() 
{ 
    string s = File.ReadAllText (@"D:\txt.txt"); 
    Console.WriteLine (s); 
    int i = s.IndexOf("se\\\">"); 
    Console.WriteLine (i); 
} 

给出了下面的输出:

some text before se\"> some text after 
17 

好像工作,我...

1
TextBox2.Text = TextBox1.Text.IndexOf("se\"">") 

似乎在VB中工作。

1

如果您正在寻找SE \“>

然后

str.IndexOf(@"se\"">") 

容易出错少,注意双 ”“ 单\

编辑,注释后:看起来这个字符串可能包含ecaping本身,在这种情况下,sep>\“是一个转义引号,所以文本文本是只需se“>和要使用的字符串是Indexof("se\">")

2

也许str变量实际上并不包含反斜杠。 可能只是在调试时将鼠标悬停在变量上时,调试器工具提示将显示转义字符。

例如如果在此分配后放置断点

string str = "123\"456"; 

工具提示将显示123“456而不是123”456。

但是,如果你点击可视化图标,你会得到正确的字符串123" 字符串中的456个

1

双引号需要像""被指定还要考虑使用逐字字符串 - 因此,一个例子是

var source = @"abdefghise\"">jklmon"; 
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8 
相关问题