2

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

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

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

返回 -1

为什么找不到子字符串?

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

4

7 回答 7

8

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

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

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

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

更新 2:根据对此答案的评论,关于字符串中 '\' 字符的作用似乎有些混乱。在 Visual Studio 调试器中检查字符串时,它会显示转义字符。

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

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

" '<em class=\"correct_response\">小夜灯</em><br /><br /><table width=\"100%\"><tr><td class=\"right\" >英格丽</td></tr></table>')"

...\"序列只是转义的引号;反斜杠不是字符串内容的一部分。因此,您实际上是在寻找'se">',而不是'se\">'。这些中的任何一个都可以工作:

str.IndexOf(@"se"">");  // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">");   // regular string; escape quotation mark using backslash
于 2009-06-25T11:52:48.780 回答
2

这有效:

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

也许您没有正确转义两个字符串之一?

编辑\您正在搜索的字符串中有几个额外的。

于 2009-06-25T11:44:05.337 回答
2

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

例如,如果你在这个赋值之后放置一个断点

string str = "123\"456";

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

但是,如果您单击可视化图标,您将获得正确的字符串 123"456

于 2009-06-25T11:53:38.187 回答
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

好像对我有用...

于 2009-06-25T11:46:20.073 回答
1
TextBox2.Text = TextBox1.Text.IndexOf("se\"">")

似乎在VB中工作。

于 2009-06-25T11:51:05.523 回答
1

如果您正在寻找 se\">

然后

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

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

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

于 2009-06-25T11:51:29.860 回答
1

字符串中的双引号需要像这样指定""也考虑使用逐字字符串 - 所以一个例子是

var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">"));  // returns 8
于 2009-06-25T11:54:30.960 回答