.NET字符串IndexOf意外结果

时间:2009-06-25 11:39:15

标签: c# .net string indexof

字符串变量str在其中包含以下内容:se\">

我正在尝试使用以下方式找到它的开头:

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

返回-1

为什么不找到子串?

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

7 个答案:

答案 0 :(得分:8)

您的代码实际上正在搜索'se\\">'。在搜索包含反斜杠的字符串时,我通常会发现使用逐字字符串更容易:

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

在这种情况下,你在搜索字符串中也有引号,所以仍有一些转义,但我个人觉得它更容易阅读。

更新:我的回答是基于在IndexOf调用参数中引入额外斜杠的编辑。根据当前版本,我会在str上下注,但不包含预期的字符序列。

更新2 : 基于对这个答案的评论,似乎对字符串中'\'字符的作用存在一些混淆。在Visual Studio调试器中检查字符串时,将显示带有转义字符的字符串。

因此,如果你有一个文本框并在其中输入'c:\',检查调试器中的Text属性将显示'c:\\'。为了逃避目的,添加了额外的反斜杠。实际的字符串内容仍然是'c:\'(可以通过检查字符串的Length属性来验证;它将是3,而不是4)。

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

  

“'< em   类= \ “correct_response \” >一种   夜灯< / em>< br   />< br />< table   宽度= \ “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

答案 1 :(得分:2)

这有效:

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

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

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

答案 2 :(得分:2)

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

e.g。如果在此作业后放置断点

string str = "123\"456";

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

但是,如果单击visualize图标,您将获得正确的字符串123“456

答案 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

好像和我一起工作......

答案 4 :(得分:1)

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

似乎在VB中有效。

答案 5 :(得分:1)

如果您正在寻找 se \“&gt;

然后

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

不易出错。注意双“”和单\

在评论之后编辑:似乎字符串可能包含ecaping本身,在这种情况下 se \“&gt; \”是一个转义引号,所以文字文字只是 se“&gt; ,而使用的字符串是Indexof("se\">")

答案 6 :(得分:1)

字符串中的DoubleQuotes需要像""一样指定。还要考虑使用逐字字符串 - 所以一个例子就是

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